python解析含有重復key的json方法
python自帶的json包能夠方便的解析json文本,但是如果json文本中包含重復key的時候,解析的結(jié)果就是錯誤的。如下為例
{"key":"1", "key":"2", "key":"3", "key2":"4"}
經(jīng)過解析,結(jié)果卻如下所示:
{
"key":"3",
"key2":"4"
}
原因是python解析的時候是創(chuàng)建一個字典,首先會讀取到key的值,但是后面遇到重復鍵的時候,后來的值會覆蓋原來的值,導致最后只有一個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使用默認的dict方法返回字典,自然會出現(xiàn)值覆蓋的情況。而有了my_obj_pairs_hook之后就調(diào)用這個函數(shù)得到字典結(jié)果,這樣我們就保證了鍵值的不丟失,最終得到我們希望的結(jié)果。如果是個更加復雜的json文本,則每次解析一個字典的時候都會調(diào)用這個函數(shù),也會傳入不同的元組列表,大致如示例所示。
以上這篇python解析含有重復key的json方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
用Python實現(xiàn)斐波那契(Fibonacci)函數(shù)
這篇文章主要介紹了用Python實現(xiàn)斐波那契(Fibonacci)函數(shù)的相關(guān)資料,需要的朋友可以參考下2016-03-03
python保存大型 .mat 數(shù)據(jù)文件報錯超出 IO 限制的操作
這篇文章主要介紹了python保存大型 .mat 數(shù)據(jù)文件報錯超出 IO 限制的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-05-05
我的快遞一個月沒動靜于是趕緊上線python快遞查詢系統(tǒng)
我的快遞在路上走了一個月還沒到,于是自己編寫快遞查詢,文中通過實例代碼截圖的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2021-09-09
matplotlib 畫動態(tài)圖以及plt.ion()和plt.ioff()的使用詳解
這篇文章主要介紹了matplotlib 畫動態(tài)圖以及plt.ion()和plt.ioff()的使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-01-01
Pandas.DataFrame時間序列數(shù)據(jù)處理的實現(xiàn)
本文主要介紹了Pandas.DataFrame時間序列數(shù)據(jù)處理的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-02-02

