2013-02-15 12 views
11
>>> raw_post_data = request.raw_post_data 
>>> print raw_post_data 
{"group":{"groupId":"2", "groupName":"GroupName"}, "members":{"1":{"firstName":"fName","lastName":"LName","address":"address"},"1": {"firstName":"f_Name","lastName":"L_Name","address":"_address"}}} 
>>> create_request = json.loads(raw_post_data) 
>>> print create_request 
{u'group': {u'groupName': u'GroupName', u'groupId': u'2'}, u'members': {u'1': {u'lastName': u'L_Name', u'firstName': u'f_Name', u'address': u'_address'}}} 

अधिलेखन आप कुंजी के साथ सदस्यों देख सकते हैं '1' जब मैं json.dumps()json.loads एक शब्दकोश में डुप्लिकेट चाबी की अनुमति देता है, पहले मान

का उपयोग ओवरराइट है वहाँ में अपवाद के रूप में यह पकड़ने के लिए कोई तरीका है पाइथन, क्लाइंट से अनुरोध में डुप्लिकेट कुंजी मिली?

+1

संबंधित उपयोग कर सकते हैं पकड़ने के लिए चाहते हैं: [SimpleJson ही नामित संस्थाओं की हैंडलिंग] (http: // stackoverflow .com/प्रश्न/7825261/simplejson-handling-of-same-named-entities) – jfs

उत्तर

22

The rfc 4627 for application/json media type अद्वितीय कुंजी सिफारिश की गई है लेकिन यह उन्हें स्पष्ट रूप से मना नहीं करता है:

किसी वस्तु में नाम अद्वितीय होना चाहिए।

rfc 2119 से:

चाहिए यह शब्द, या विशेषण "सुझाए गए", इसका मतलब यह है कि वहाँ
एक
विशेष आइटम की अनदेखी करने के विशेष परिस्थितियों में वैध कारण मौजूद हो सकता है, लेकिन पूर्ण प्रभावों को समझा जाना चाहिए और
सावधानीपूर्वक एक अलग कोर्स चुनने से पहले वजन कम किया जाना चाहिए।

import json 

def dict_raise_on_duplicates(ordered_pairs): 
    """Reject duplicate keys.""" 
    d = {} 
    for k, v in ordered_pairs: 
     if k in d: 
      raise ValueError("duplicate key: %r" % (k,)) 
     else: 
      d[k] = v 
    return d 

json.loads(raw_post_data, object_pairs_hook=dict_raise_on_duplicates) 
# -> ValueError: duplicate key: u'1' 
+0

+1 अच्छा, यह बहुत बेहतर दिखता है :) – root

+0

हाँ, जो मैं खोज रहा था .. थक्स .. हालांकि, json.load() लाइब्रेरी को ऐसा कुछ प्रदान करना चाहिए जो समान हो सके .. –

+2

@ अनुज आचार्य: समस्या यह है कि अच्छे हैं एक सादे निर्देश के लिए मामलों का उपयोग करें, एक "बहुआयामी", एक "बहु-केवल-ऑन-डुप्स-dict", एक "raise-ऑन-डुप्स-dict" (ValueError, या KeyError?), और संभवतः अन्य। और आप 'json.loads' और' json.load', और 'csv.DictReader', और' yaml.load', और इसी तरह से वही चीज़ चाहते हैं। ('Csv' के बारे में पाइथन-विचारों पर वर्तमान चर्चा देखें।) आप सभी संभावित लोड फ़ंक्शंस के लिए सभी संभावित व्यवहार लिखना नहीं चाहते हैं। और 'object_pairs_hook' इसे रद्द करने का बिल्कुल सही तरीका लगता है। – abarnert

1

वैकल्पिक रूप से यदि आप सभी डुप्लिकेट चाबी (प्रति स्तर) यदि आप एक collections.Counter

from collections import Counter 

class KeyWatcher(dict): 

    def __init__(self, *args): 
     duplicates = [d for d,i in Counter([pair[0] for pair in args[0]]).items() if i > 0] 
     if duplicates: 
      raise KeyError("Can't add duplicate keys {} to a json message".format(duplicates)) 
     self.update(*args[0]) 

json.loads(raw_post_data, object_pairs_hook=KeyWatcher) 
+1

आपका काउंटर अवसरों की संख्या की गणना कर रहा है, इसलिए सूची की समझ में शर्त एक बार से अधिक दिखाई देने वाली कुंजियों को खोजने के लिए 'यदि i> 1' नहीं' i- 0' होना चाहिए। –

+0

दरअसल, उस सुधार के बाद भी यह विज्ञापित के रूप में काम नहीं करता है। हालांकि, जेएफ सेबेस्टियन का कोड काम करता था। मैं इसका उपयोग करने की अनुशंसा करता हूं, भले ही इस दृष्टिकोण के लिए कुछ लालित्य प्रतीत होता है कि यह लूप के बजाय सूची समझ का उपयोग करता है। –

+0

एक त्वरित फिक्स 'self.update (args [0]) होगा, यानी तारांकन के बिना। KeyWatcher को केवल एक तर्क के साथ बुलाया जाता है, इस प्रकार '* args' सहायक नहीं है। – VPfB

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

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