Python 使用json.dumps()时出现UnicodeDecodeError
我的python列表中有如下字符串(取自命令提示符): 我尝试过这里提到的建议: 进一步将默认编码也更改为utf-16。但是仍然Python 使用json.dumps()时出现UnicodeDecodeError,python,json,python-2.7,unicode,character-encoding,Python,Json,Python 2.7,Unicode,Character Encoding,我的python列表中有如下字符串(取自命令提示符): 我尝试过这里提到的建议: 进一步将默认编码也更改为utf-16。但是仍然json.dumps()抛出异常,如下所示: >>> write(o) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "okapi_create_master.py", line 49, in write o
json.dumps()
抛出异常,如下所示:
>>> write(o)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "okapi_create_master.py", line 49, in write
o = json.dumps(output)
File "C:\Python27\lib\json\__init__.py", line 231, in dumps
return _default_encoder.encode(obj)
File "C:\Python27\lib\json\encoder.py", line 201, in encode
chunks = self.iterencode(o, _one_shot=True)
File "C:\Python27\lib\json\encoder.py", line 264, in iterencode
return _iterencode(o, 0)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xe1 in position 25: invalid
continuation byte
写入(o)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
写入文件“okapi_create_master.py”,第49行
o=json.dumps(输出)
文件“C:\Python27\lib\json\\ uuuuu init\uuuuu.py”,第231行,转储
返回默认编码器编码(obj)
文件“C:\Python27\lib\json\encoder.py”,第201行,在encode中
chunks=self.iterencode(o,\u one\u shot=True)
文件“C:\Python27\lib\json\encoder.py”,第264行,在iterencode中
返回_iterencode(o,0)
UnicodeDecodeError:“utf8”编解码器无法解码位置25处的字节0xe1:无效
连续字节
无法确定这类字符串需要什么类型的转换才能使
json.dumps()
工作。\xe1
无法使用utf-8、utf-16编码进行解码
>'\xe1'.解码('utf-8')
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“C:\Python27\lib\encodings\utf_8.py”,第16行,解码
返回编解码器.utf_8_解码(输入,错误,真)
UnicodeDecodeError:“utf8”编解码器无法对位置0中的字节0xe1进行解码:数据意外结束
>>>“\xe1”。解码('utf-16')
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“C:\Python27\lib\encodings\utf_16.py”,第16行,解码
返回编解码器.utf_16_解码(输入,错误,真)
UnicodeDecodeError:“utf16”编解码器无法解码位置0中的字节0xe1:截断的数据
尝试拉丁1编码:
>>> record = (5790, 'Vlv-Gate-Assy-Mdl-\xe1M1-2-\xe19/16-10K-BB Credit Memo ',
... 60, True, '40141613')
>>> json.dumps(record, encoding='latin1')
'[5790, "Vlv-Gate-Assy-Mdl-\\u00e1M1-2-\\u00e19/16-10K-BB Credit Memo ", 60, true, "40141613"]'
或者,指定确保_ascii=False
,json.dumps
以使json.dumps
不尝试解码字符串
>>> json.dumps(record, ensure_ascii=False)
'[5790, "Vlv-Gate-Assy-Mdl-\xe1M1-2-\xe19/16-10K-BB Credit Memo ", 60, true, "40141613"]'
我也遇到了类似的问题,并提出了以下方法来从任意一个输入中保证Unicode或字节字符串。简而言之,以下是lambda:
# guarantee unicode string
_u = lambda t: t.decode('UTF-8', 'replace') if isinstance(t, str) else t
_uu = lambda *tt: tuple(_u(t) for t in tt)
# guarantee byte string in UTF8 encoding
_u8 = lambda t: t.encode('UTF-8', 'replace') if isinstance(t, unicode) else t
_uu8 = lambda *tt: tuple(_u8(t) for t in tt)
适用于你的问题:
import json
o = (5790, u"Vlv-Gate-Assy-Mdl-\xe1M1-2-\xe19/16-10K-BB Credit Memo ", 60,
True, '40141613')
as_json = json.dumps(_uu8(*o))
as_obj = json.loads(as_json)
print "object\n ", o
print "json (type %s)\n %s " % (type(as_json), as_json)
print "object again\n ", as_obj
=>
对象
(5790,u'Vlv-Gate-Assy-Mdl-\xe1M1-2-\xe19/16-10K-BB信用备忘录',60,真实,'40141613')
json(类型)
[5790,“Vlv闸门组件Mdl-\u00e1M1-2-\u00e19/16-10K-BB信用备忘录”,60,正确,“40141613”]
再次反对
[5790,u'Vlv-Gate-Assy-Mdl-\xe1M1-2-\xe19/16-10K-BB信用备忘录',60,正确,u'40141613']
还有一些。使用
确保\u ascii=False来删除错误的最快方法。另请参见:
import json
o = (5790, u"Vlv-Gate-Assy-Mdl-\xe1M1-2-\xe19/16-10K-BB Credit Memo ", 60,
True, '40141613')
as_json = json.dumps(_uu8(*o))
as_obj = json.loads(as_json)
print "object\n ", o
print "json (type %s)\n %s " % (type(as_json), as_json)
print "object again\n ", as_obj
object
(5790, u'Vlv-Gate-Assy-Mdl-\xe1M1-2-\xe19/16-10K-BB Credit Memo ', 60, True, '40141613')
json (type <type 'str'>)
[5790, "Vlv-Gate-Assy-Mdl-\u00e1M1-2-\u00e19/16-10K-BB Credit Memo ", 60, true, "40141613"]
object again
[5790, u'Vlv-Gate-Assy-Mdl-\xe1M1-2-\xe19/16-10K-BB Credit Memo ', 60, True, u'40141613']