2013-02-02 58 views
64

使用pprint转换Python字典,以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} 

当我这样做:

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

我得到这个错误:'utf8' codec can't decode byte 0xff in position 0: invalid start byte

+0

你的问题在于:'\ xff' –

回答

119

如果您在您的json中使用非打印符号都可以,然后将ensure_ascii=False添加到dumps调用中。

>>> json.dumps(your_data, ensure_ascii=False) 
​​3210
+0

将'indent = n'添加到漂亮打印的选项中,其中'n'是要缩进的空格数 – RTF

12

ensure_ascii =假真的只能推迟问题的解码阶段:

>>> 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字符串的方法 - 比如base64。

>>> 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

您可以在json中传递任意二进制数据(效率低下)使用'latin1'编码](http://ideone.com/VrOtxm) – jfs

+1

你可以,我想,但json被设计/打算使用utf-8。 –

+2

@ J.F.Sebastian:的确,与'b64encode'相比,_very_效率低下。例如,对于256字符串s =''.join(xr(256))中的i,chr(i)),len(json.dumps(b64encode(s)))== 346' vs'len (json.dumps(s.decode('latin1')))== 1045'。 – martineau

2

我使用的一种可能的解决方案是使用python3。它似乎解决了很多utf问题。

对不起,对于迟来的答案,但它可能会帮助未来的人。

例如,

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

当然,你是该死的,Python 3解决了许多编码问题。但这不是这个问题的答案。它显式标记为python-2.7。所以你说的是这样的:你的旧车没有内置的真空吸尘器。所以请购买一辆新车,而不是在您的旧车中添加吸尘器。 – colidyre

7

如果您使用Python 2,不要忘记添加你的脚本的第一行中的UTF-8编码的文件注释。

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

这将解决一些Unicode问题,让您的生活更轻松。