2013-04-23 50 views
6

具有在地圖重複鍵時,json模塊蟒蛇的行爲一點的規範:的Json在Python:接收/檢查重複鍵錯誤

import json 
>>> json.loads('{"a": "First", "a": "Second"}') 
{u'a': u'Second'} 

我知道這種行爲是在documentation規定:

的RFC指定一個JSON對象中的名稱應該是 唯一的,但沒有規定如何在JSON對象重複名應該 處理。默認情況下,該模塊不會引發異常; 相反,它會忽略所有但對於一個給定名稱的最後一個名稱 - 值對:

對於我目前的項目,我絕對需要確保沒有重複的鍵出現在文件中,並收到一個錯誤/如果是這種情況,例外嗎?這如何實現?

我仍然停留在Python 2.7上,所以一個也適用於舊版本的解決方案對我最有幫助。

回答

10

那麼,你可以嘗試使用JSONDecoder類,並指定一個自定義object_pairs_hook,它將在它們被重複之前收到重複。

import json 

def dupe_checking_hook(pairs): 
    result = dict() 
    for key,val in pairs: 
     if key in result: 
      raise KeyError("Duplicate key specified: %s" % key) 
     result[key] = val 
    return result 

decoder = json.JSONDecoder(object_pairs_hook=dupe_checking_hook) 

# Raises a KeyError 
some_json = decoder.decode('''{"a":"hi","a":"bye"}''') 

# works 
some_json = decoder.decode('''{"a":"hi","b":"bye"}''') 
+1

謝謝!有沒有可能在錯誤消息上生成一些上下文?例如包含錯誤的地圖名稱(如果有的話)? – theomega 2013-04-24 11:12:35

+1

不容易,因爲鉤子只獲取鍵值對。 (你可以倒出整個列表,這可能會給你一個很好的猜測,它是基於值的集合,但也可能相當大。) – Amber 2013-04-25 06:42:22