2013-02-02 17 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=Falsedumpsに追加してください。

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

印字するオプションに' indent = n'を追加します。ここで 'n'はインデントするスペースの数です – RTF

12

ensure_ascii = Falseの本当に唯一のデコードステージに問題を延期:

>>> 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'と比較して非常に非効率的です。たとえば、256文字の文字列 's = '' .join(xrange(256)のiの場合はchr(i))'、 'len(json.dumps(b64encode(s)))== 346'と' len (json.dumps(s.decode( 'latin1')))== 1045である。 – martineau

2

私が使用する解決策の1つは、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 -*- 

これは、いくつかのユニコードの問題を修正し、あなたの人生を楽にします。

関連する問題