कन्वर्ट पायथन शब्दकोश JSON सरणी में


98

वर्तमान में मेरे पास यह शब्दकोश है, जिसका उपयोग करके मुद्रित किया गया है pprint:

{'AlarmExTempHum': '\x00\x00\x00\x00\x00\x00\x00\x00',  
'AlarmIn': 0,  
'AlarmOut': '\x00\x00',  
'AlarmRain': 0,  
'AlarmSoilLeaf': '\x00\x00\x00\x00',  
'BarTrend': 60,  
'BatteryStatus': 0,  
'BatteryVolts': 4.751953125,  
'CRC': 55003,
'EOL': '\n\r',
'ETDay': 0,
'ETMonth': 0,
'ETYear': 0,
'ExtraHum1': None,
'ExtraHum2': None,
'ExtraHum3': None,
'ExtraHum4': None,
'ExtraHum5': None,
'ExtraHum6': None,
'ExtraHum7': None,
'ExtraTemp1': None,
'ExtraTemp2': None,
'ExtraTemp3': None,
'ExtraTemp4': None,
'ExtraTemp5': None,
'ExtraTemp6': None,
'ExtraTemp7': None,
'ForecastIcon': 2,
'ForecastRuleNo': 122,
'HumIn': 31,
'HumOut': 94,
'LOO': 'LOO',
'LeafTemps': '\xff\xff\xff\xff',
'LeafWetness': '\xff\xff\xff\x00',
'NextRec': 37,
'PacketType': 0,
'Pressure': 995.9363359295631,
'RainDay': 0.0,
'RainMonth': 0.0,
'RainRate': 0.0,
'RainStorm': 0.0,
'RainYear': 2.8,
'SoilMoist': '\xff\xff\xff\xff',
'SoilTemps': '\xff\xff\xff\xff',
'SolarRad': None,
'StormStartDate': '2127-15-31',
'SunRise': 849,
'SunSet': 1611,
'TempIn': 21.38888888888889,
'TempOut': 0.8888888888888897,
'UV': None,
'WindDir': 219,
'WindSpeed': 3.6,
'WindSpeed10Min': 3.6}

जब मैं ऐसा करता हूं:

import json
d = (my dictionary above)
jsonarray = json.dumps(d)

मुझे यह त्रुटि मिली: 'utf8' codec can't decode byte 0xff in position 0: invalid start byte


आपकी समस्या यहाँ है:\xff
— बेंजामिन टौगे

जवाबों:


167

यदि आप अपने जोंस में गैर-मुद्रण योग्य प्रतीकों के साथ ठीक हैं, तो कॉल ensure_ascii=Falseकरने के लिए जोड़ें dumps।

>>> json.dumps(your_data, ensure_ascii=False)

यदि ensure_asciiगलत है, तो वापसी मूल्य एक unicodeउदाहरण के लिए एक ASCII से बचने के बजाय सामान्य नियम के strलिए unicodeज़बरदस्ती नियमों के अधीन होगा str।


1
indent=nसुंदर प्रिंट के विकल्पों में जोड़ें , जहां nइंडेंट करने के लिए रिक्त स्थान की संख्या है
— RTF

17

सुनिश्चित करें_सच्ची = गलत वास्तव में केवल मुद्दे को डिकोडिंग चरण तक ही सीमित करता है:

>>> dict2 = {'LeafTemps': '\xff\xff\xff\xff',}
>>> json1 = json.dumps(dict2, ensure_ascii=False)
>>> print(json1)
{"LeafTemps": "����"}
>>> json.loads(json1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/json/__init__.py", line 328, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python2.7/json/decoder.py", line 365, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/python2.7/json/decoder.py", line 381, in raw_decode
    obj, end = self.scan_once(s, idx)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xff in position 0: invalid start byte

अंततः आप JSON दस्तावेज़ में कच्चे बाइट्स को संग्रहीत नहीं कर सकते, इसलिए आप ASCII स्ट्रिंग - जैसे कि64 के रूप में मनमाने ढंग से बाइट्स के एक क्रम को एन्कोडिंग के कुछ साधनों का उपयोग करना चाहते हैं।

>>> import json
>>> from base64 import b64encode, b64decode
>>> my_dict = {'LeafTemps': '\xff\xff\xff\xff',} 
>>> my_dict['LeafTemps'] = b64encode(my_dict['LeafTemps'])
>>> json.dumps(my_dict)
'{"LeafTemps": "/////w=="}'
>>> json.loads(json.dumps(my_dict))
{u'LeafTemps': u'/////w=='}
>>> new_dict = json.loads(json.dumps(my_dict))
>>> new_dict['LeafTemps'] = b64decode(new_dict['LeafTemps'])
>>> print new_dict
{u'LeafTemps': '\xff\xff\xff\xff'}


1
आप कर सकते हैं, मुझे लगता है, लेकिन json utf-8 का उपयोग करने के लिए डिज़ाइन किया गया है।
— कार्ल स्नेचेल

2
@JFSebastian: वास्तव में, की तुलना में बहुत अक्षम है b64encode। उदाहरण के लिए, 256 वर्ण स्ट्रिंग के लिए s = ''.join(chr(i) for i in xrange(256)), len(json.dumps(b64encode(s))) == 346बनाम len(json.dumps(s.decode('latin1'))) == 1045।
— मार्टीन्यू

10

यदि आप पायथन 2 का उपयोग करते हैं, तो अपनी स्क्रिप्ट की पहली पंक्ति पर UTF-8 फ़ाइल एन्कोडिंग टिप्पणी जोड़ना न भूलें।

# -*- coding: UTF-8 -*-

यह कुछ यूनिकोड समस्याओं को ठीक करेगा और आपके जीवन को आसान बना देगा।


2

एक संभव समाधान जो मैं उपयोग करता हूं वह पायथन 3 का उपयोग करना है। यह कई यूएफ मुद्दों को हल करने के लिए लगता है।

देर से जवाब के लिए क्षमा करें, लेकिन यह भविष्य में लोगों की मदद कर सकता है।

उदाहरण के लिए,

#!/usr/bin/env python3
import json
# your code follows

4
यकीन है, तुम सही हो, अजगर 3 कई एन्कोडिंग मुद्दों को हल किया। लेकिन यह उस सवाल का जवाब नहीं है। यह स्पष्ट रूप से अजगर-2.7 के साथ टैग किया गया है। तो आप जो कह रहे हैं वह कुछ इस तरह है: आपकी पुरानी कार में बिल्ट-इन वैक्यूम क्लीनर नहीं है। इसलिए कृपया अपनी पुरानी कार में वैक्यूम क्लीनर जोड़ने के बजाय नई कार खरीदें।
— कोलाइडर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.