python解析含有重複key的json方法

2022-10-04 18:12:08 字數 1357 閱讀 2220

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

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

原因是pyth解析的時候是建立乙個字典,首先會讀取到key的值,但是後面遇到重複鍵的時候,後來的值會覆蓋原來的值,導致最後只有乙個key的值留下來。

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

如何得到這種結果呢?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:

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合併

昨天敲 遇到了乙個問題,兩個字典都是用來統計單詞出現次數的,可是我需要將兩個字典和為乙個。首先,統計乙個列表裡元素數量可以使用如下方法 a a a a c b c d e r w w d b a b a d c r a e r b s w def hanshu a dic for i in a di...

JSON解析動態key

工作中後台給我傳了帶動態的key的json報文的資料,由於沒有弄過 key後面需要的 success 1 就是上面這樣的,沒有接觸過,查資料,幸虧網上有資料,記錄一下。可以通過jsonobject 的keys 方法獲得乙個迭代器,然後遍歷所有的key,keys方法返回乙個iterator物件,它有h...

獲得python的list中含有重複值的index

關於怎麼獲得,我想其實網上有很多答案。list.index 獲得值的索引值,但是如果list中含有的值一樣,例如含有兩個11,22,這樣每次獲得的都是第乙個值的位置。那麼怎麼去解決這個問題呢?下面的程式對這個問題做了一定的解答 usr bin env python coding utf 8 auth...