2013-04-23 7 views
6

अजगर की json मॉड्यूल विनिर्देश का एक छोटा जब एक नक्शे में डुप्लिकेट चाबी होने में कार्य करता है:Json: प्राप्त करें/चेक नकली चाबी त्रुटि

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

मुझे पता है कि इस व्यवहार documentation में निर्दिष्ट किया जाता:

आरएफसी निर्दिष्ट करता है कि एक JSON वस्तु के भीतर नाम अद्वितीय होना चाहिए, लेकिन कैसे JSON ऑब्जेक्ट में दोहराया नाम संभाला जाना चाहिए निर्दिष्ट नहीं है। डिफ़ॉल्ट रूप से, यह मॉड्यूल अपवाद नहीं बढ़ाता है; बजाय, यह सब लेकिन किसी दिए गए नाम के लिए पिछले नाम-मान युग्म पर ध्यान नहीं देता:

मेरे वर्तमान परियोजना के लिए, मैं बिल्कुल सुनिश्चित करें कि कोई डुप्लिकेट चाबी फ़ाइल में उपस्थित हैं, और कोई त्रुटि प्राप्त करने की आवश्यकता है/अपवाद अगर यह मामला है? इसे किस तरह पूर्ण कर सकते है?

मैं अभी भी पायथन 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

संबंधित मुद्दे