2013-04-23 6 views
6

jsonモジュールは、仕様の少し行為:JSON:マップ内の重複するキーを持つとき受信/重複キーエラーをチェックパイソンの

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

+1

フックはキーと値のペアだけを取得するため、簡単にはありません。 (リスト全体をダンプすることができます。これはおそらく、値の集まりに基づいていたものについては良い推測をしますが、かなり大きいかもしれません)。 – Amber

関連する問題