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...