2013-02-02 16 views
64

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

{'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} 

जब मैं यह कर: 'utf8' codec can't decode byte 0xff in position 0: invalid start byte

+0

आपकी समस्या यहां निहित है: '\ xff' –

उत्तर

119

आप हैं:

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

मैं इस त्रुटि मिलती है अपने जेसन में गैर-प्रिंट करने योग्य प्रतीकों के साथ ठीक हैं, फिर ensure_ascii=Falsedumps कॉल जोड़ें।

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

If ensure_ascii is false, then the return value will be a unicode instance subject to normal Python str to unicode coercion rules instead of being escaped to an ASCII str .

+0

सुंदर प्रिंट के विकल्पों में 'indent = n' जोड़ें, जहां' 0' – RTF

12

ensure_ascii = झूठी वास्तव में केवल डिकोडिंग चरण के लिए इस मुद्दे को defers:

>>> 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'} 
+0

इंडेंट करने के लिए रिक्त स्थान की संख्या है, आप जेसन में मनमाने ढंग से बाइनरी डेटा (अक्षमतापूर्वक) पारित कर सकते हैं [ 'latin1' एन्कोडिंग का उपयोग करके] (http://ideone.com/VrOtxm) – jfs

+1

आप मान सकते हैं, लेकिन जेसन डिज़ाइन/utf-8 का उपयोग करने के लिए बनाया गया है। –

+2

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

2

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

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

उदाहरण के लिए

,

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

निश्चित रूप से, आप सही हैं, पायथन 3 ने कई एन्कोडिंग मुद्दों को हल किया है। लेकिन यह उस सवाल का जवाब नहीं है। यह स्पष्ट रूप से पायथन-2.7 के साथ टैग किया गया है। तो आप जो कह रहे हैं वह इस तरह कुछ है: आपकी पुरानी कार में कोई अंतर्निर्मित वैक्यूम क्लीनर नहीं है। तो कृपया अपनी पुरानी कार में वैक्यूम क्लीनर जोड़ने की बजाय एक नई कार खरीदें। – colidyre

7

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

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

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

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