2010-08-23 13 views
6

कुंजी के रूप में किसी के साथ एक डंप को डंपिंग और लोड करना, परिणाम के रूप में "शून्य" के साथ एक निर्देश में परिणाम।पायथन + जेएसओएन, किसी के साथ क्या हुआ?

मान असंतुष्ट हैं, लेकिन यदि स्ट्रिंग-कुंजी "शून्य" वास्तव में मौजूद है तो चीजें और भी बदतर हो जाती हैं।

मैं यहाँ क्या गलत कर रहा हूं? मैं "कोई नहीं" कुंजी के साथ एक dictial serialize/deserialize क्यों नहीं कर सकता?

उदाहरण

>>> json.loads(json.dumps({'123':None, None:'What happened to None?'})) 
{u'123': None, u'null': u'What happened to None?'} 
>>> json.loads(json.dumps({'123':None, None:'What happened to None?', 'null': 'boom'})) 
{u'123': None, u'null': u'boom'} 
+1

दूसरे कोड के बीटीडब्ल्यू आउटपुट के साथ झुका हुआ प्रतीत होता है। –

उत्तर

17

JSON ऑब्जेक्ट्स स्ट्रिंग्स के नक्शे के मान हैं। यदि आप किसी अन्य प्रकार की कुंजी का उपयोग करने का प्रयास करते हैं, तो वे तारों में परिवर्तित हो जाएंगे।

>>> json.loads(json.dumps({123: None})) 
{'123': None} 
>>> json.loads(json.dumps({None: None})) 
{'null': None} 
10

specification के अनुसार, None किसी मान्य कुंजी नहीं है। यह एक JSON ऑब्जेक्ट अभिव्यक्ति है, जो की तरह

{ ..., null: ..., ... } 

लग रहा है जो मान्य नहीं है के लिए राशि होता (यानी, वाक्य रचना आरेख उपयोग करते हुए उत्पन्न नहीं किया जा सकता।)

बेशक, JSON मॉड्यूल पर एक अपवाद उठाया जाना चाहिए था चुपचाप मूल्य की स्ट्रिंग प्रस्तुति उत्पन्न करने के बजाय serialization।

संपादित बस देखा था, कि मॉड्यूल के व्यवहार documented (कुछ परोक्ष) है:

तो skipkeys यह सच है (डिफ़ॉल्ट: गलत), तो dict कुंजी है कि एक बुनियादी प्रकार के नहीं हैं (str, यूनिकोड, int, long, float, bool, none) टाइप टाइपर को बढ़ाने के बजाय छोड़ा जाएगा।

ऐसा लगता है, जैसे कि यह व्यवहार जानबूझकर है (मुझे अभी भी यह वर्तमान JSON विनिर्देश दिया गया है)।

+1

skipKeys का पालन व्यवहार पर कोई प्रभाव नहीं पड़ता है। "कोई नहीं" एक मूल प्रकार है इसलिए skipKeys = True एक "skipping" का कारण नहीं बनता है जैसे skipKeys = झूठा टाइपरर का कारण नहीं बनता है। मुझे प्रलेखन में एक छोटा सा नोट पसंद आया होगा, जैसे कुछ: "उलटा एन्कोडिंग के लिए, केवल तारों के रूप में स्ट्रिंग का उपयोग करें।" – safl

-1

जैसा कि @ dan04 दिखाता है, कोई भी 'शून्य' में परिवर्तित नहीं होता है।
सबकुछ ठीक है, मान को "शून्य:" के साथ क्या किया गया है, "शून्य: 'कोई भी नहीं हुआ?'

लेकिन फिर 'नल' के साथ एक और कुंजी आई।
तो कोई भी/'शून्य'-कुंजी ("किसी के साथ क्या हुआ?" के साथ पुराना मान "बूम" के साथ अधिलेखित है।

+0

क्यों डाउनवॉट्स, इस उत्तर के साथ क्या गलत है? –

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