国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python解析含有重復(fù)key的json方法

2020-02-16 00:47:41
字體:
供稿:網(wǎng)友

python自帶的json包能夠方便的解析json文本,但是如果json文本中包含重復(fù)key的時候,解析的結(jié)果就是錯誤的。如下為例

 {"key":"1", "key":"2", "key":"3", "key2":"4"}

經(jīng)過解析,結(jié)果卻如下所示:

{  "key":"3",  "key2":"4"}

原因是python解析的時候是創(chuàng)建一個字典,首先會讀取到key的值,但是后面遇到重復(fù)鍵的時候,后來的值會覆蓋原來的值,導(dǎo)致最后只有一個key的值留下來。

這肯定不是我們想要的結(jié)果,其中一種結(jié)果可以是將相同鍵的值聚合成一個數(shù)組,即如下所示。

{  "key":["1","2","3"],  "key2":"4"}

如何得到這種結(jié)果呢?python的json包還是留下了活路的。首先來看一下解析函數(shù)loads的原型。

json.loads(s, encoding=None, cls=None,     object_hook=None, parse_float=None,     parse_int=None, parse_constant=None,     object_pairs_hook=None, **kw)

要注意的是object_pairs_hook這個參數(shù),這是個回調(diào)函數(shù),在解析json文本的時候會調(diào)用它并更改返回的結(jié)果。為了得到前述的結(jié)果,我們定義如下的hook函數(shù):

def my_obj_pairs_hook(lst):  result={}  count={}  for key,val in lst:    if key in count:count[key]=1+count[key]    else:count[key]=1    if key in result:      if count[key] > 2:        result[key].append(val)      else:        result[key]=[result[key], val]    else:      result[key]=val  return result

在解析文本的時候?qū)⑸鲜龊瘮?shù)作為參數(shù)傳入,代碼如下所示:

json.loads(data, object_pairs_hook=my_obj_pairs_hook)

即可得到前述的相同鍵的值合并為數(shù)組的結(jié)果。

在這個示例中,傳入my_obj_pairs_hook的參數(shù)是一個元組列表,大致如下所示:

[("key","1"),("key","2"),("key","3"),("key2","4")]

之所以參數(shù)是這個樣子,是因為這幾個鍵值對組成了一個字典,python使用默認(rèn)的dict方法返回字典,自然會出現(xiàn)值覆蓋的情況。而有了my_obj_pairs_hook之后就調(diào)用這個函數(shù)得到字典結(jié)果,這樣我們就保證了鍵值的不丟失,最終得到我們希望的結(jié)果。如果是個更加復(fù)雜的json文本,則每次解析一個字典的時候都會調(diào)用這個函數(shù),也會傳入不同的元組列表,大致如示例所示。

以上這篇python解析含有重復(fù)key的json方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持武林站長站。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 上林县| 仪陇县| 右玉县| 玉龙| 普定县| 元朗区| 五原县| 阳谷县| 大宁县| 隆子县| 崇明县| 子长县| 浮梁县| 石林| 神池县| 舞阳县| 芒康县| 宁河县| 包头市| 安泽县| 苗栗市| 岢岚县| 银川市| 绿春县| 丰都县| 安化县| 玉溪市| 三明市| 吉安市| 吉木萨尔县| 沙雅县| 井冈山市| 兴海县| 利辛县| 荥经县| 临漳县| 马龙县| 台北市| 江口县| 黎川县| 察雅县|