溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

python如何解析含有重復(fù)key的json

發(fā)布時(shí)間:2021-08-18 14:13:04 來(lái)源:億速云 閱讀:766 作者:小新 欄目:開發(fā)技術(shù)

這篇文章給大家分享的是有關(guān)python如何解析含有重復(fù)key的json的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。

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

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

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

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

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

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

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

如何得到這種結(jié)果呢?python的json包還是留下了活路的。首先來(lái)看一下解析函數(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這個(gè)參數(shù),這是個(gè)回調(diào)函數(shù),在解析json文本的時(shí)候會(huì)調(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

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

json.loads(data, object_pairs_hook=my_obj_pairs_hook)

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

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

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

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

感謝各位的閱讀!關(guān)于“python如何解析含有重復(fù)key的json”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI