माइक ब्रेनन का जवाब करीब है, लेकिन पूरे ढांचे को फिर से आगे बढ़ाने का कोई कारण नहीं है। यदि आप object_hook_pairs
(पायथन 2.7+) पैरामीटर का उपयोग करते हैं :
object_pairs_hook
एक वैकल्पिक कार्य है जिसे किसी भी वस्तु के शाब्दिक परिणाम के साथ कहा जाएगा जिसे जोड़ियों की क्रमबद्ध सूची के साथ डिकोड किया गया है। के बदले मूल्य का object_pairs_hook
उपयोग किया जाएगा dict
। इस सुविधा का उपयोग कस्टम डिकोडर्स को लागू करने के लिए किया जा सकता है जो इस आदेश पर भरोसा करते हैं कि कुंजी और मूल्य जोड़े डिकोड किए गए हैं (उदाहरण के लिए, collections.OrderedDict
सम्मिलन के आदेश को याद करेंगे)। यदि object_hook
यह भी परिभाषित किया गया है, object_pairs_hook
प्राथमिकता लेता है।
इसके साथ, आप प्रत्येक JSON ऑब्जेक्ट को आपके हवाले कर देते हैं, ताकि आप पुनरावर्तन की आवश्यकता के साथ डिकोडिंग कर सकें:
def deunicodify_hook(pairs):
new_pairs = []
for key, value in pairs:
if isinstance(value, unicode):
value = value.encode('utf-8')
if isinstance(key, unicode):
key = key.encode('utf-8')
new_pairs.append((key, value))
return dict(new_pairs)
In [52]: open('test.json').read()
Out[52]: '{"1": "hello", "abc": [1, 2, 3], "def": {"hi": "mom"}, "boo": [1, "hi", "moo", {"5": "some"}]}'
In [53]: json.load(open('test.json'))
Out[53]:
{u'1': u'hello',
u'abc': [1, 2, 3],
u'boo': [1, u'hi', u'moo', {u'5': u'some'}],
u'def': {u'hi': u'mom'}}
In [54]: json.load(open('test.json'), object_pairs_hook=deunicodify_hook)
Out[54]:
{'1': 'hello',
'abc': [1, 2, 3],
'boo': [1, 'hi', 'moo', {'5': 'some'}],
'def': {'hi': 'mom'}}
ध्यान दें कि मुझे कभी भी हुक को पुन: कॉल करने की आवश्यकता नहीं है क्योंकि प्रत्येक वस्तु हुक को सौंप दी जाएगी जब आप उपयोग करेंगे object_pairs_hook
। आपको सूचियों के बारे में ध्यान रखने की ज़रूरत है, लेकिन जैसा कि आप देख सकते हैं, सूची के भीतर एक वस्तु को ठीक से परिवर्तित किया जाएगा, और आपको ऐसा करने के लिए पुनरावृत्ति करने की आवश्यकता नहीं है।
संपादित करें: एक सहकर्मी ने बताया कि पायथन 2.6 में नहीं है object_hook_pairs
। आप अभी भी Python2.6 का उपयोग बहुत कम परिवर्तन करके कर सकते हैं। ऊपर हुक में, बदलें:
for key, value in pairs:
सेवा
for key, value in pairs.iteritems():
इसके object_hook
बजाय का उपयोग करें object_pairs_hook
:
In [66]: json.load(open('test.json'), object_hook=deunicodify_hook)
Out[66]:
{'1': 'hello',
'abc': [1, 2, 3],
'boo': [1, 'hi', 'moo', {'5': 'some'}],
'def': {'hi': 'mom'}}
object_pairs_hook
JSON ऑब्जेक्ट में प्रत्येक ऑब्जेक्ट के लिए एक कम शब्दकोश में परिणाम का उपयोग करना , जो, यदि आप एक विशाल दस्तावेज़ पार्स कर रहे थे, तो हो सकता है।
str