python 解析json數組,python讀取json并列_python解析含有重復key的json方法

 2023-10-04 阅读 44 评论 0

摘要:python自帶的json包能夠方便的解析json文本,但是如果json文本中包含重復key的時候,解析的結果就是錯誤的。如下為例python 解析json數組、{"key":"1", "key":"2", "key":"3", "key2":"4"}經過

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

python 解析json數組、{"key":"1", "key":"2", "key":"3", "key2":"4"}

經過解析,結果卻如下所示:

python字符串轉json對象?{

"key":"3",

"key2":"4"

}

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

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

{

"key":["1","2","3"],

"key2":"4"

}

如何得到這種結果呢?python的json包還是留下了活路的。首先來看一下解析函數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這個參數,這是個回調函數,在解析json文本的時候會調用它并更改返回的結果。為了得到前述的結果,我們定義如下的hook函數:

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

在解析文本的時候將上述函數作為參數傳入,代碼如下所示:

json.loads(data, object_pairs_hook=my_obj_pairs_hook)

即可得到前述的相同鍵的值合并為數組的結果。

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

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

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

以上這篇python解析含有重復key的json方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持我們。

本文標題: python解析含有重復key的json方法

本文地址: http://www.cppcns.com/jiaoben/python/250635.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/3/112844.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息