为什么我在Python的JSON编码中得到UnicodeDecodeError?

Jes*_*ose 2 python json

我使用Solr 3.3来索引我的数据库中的东西.我用Python编写JSON内容.我设法上传了2126条记录,共计523246个字符(约511kb).但是当我尝试2027条记录时,Python给了我错误:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "D:\Technovia\db_indexer\solr_update.py", line 69, in upload_service_details
    request_string.append(param_list)
  File "C:\Python27\lib\json\__init__.py", line 238, in dumps
    **kw).encode(obj)
  File "C:\Python27\lib\json\encoder.py", line 203, in encode
    chunks = list(chunks)
  File "C:\Python27\lib\json\encoder.py", line 425, in _iterencode
    for chunk in _iterencode_list(o, _current_indent_level):
  File "C:\Python27\lib\json\encoder.py", line 326, in _iterencode_list
    for chunk in chunks:
  File "C:\Python27\lib\json\encoder.py", line 384, in _iterencode_dict
    yield _encoder(value)
UnicodeDecodeError: 'utf8' codec can't decode byte 0x96 in position 68: invalid start byte 
Run Code Online (Sandbox Code Playgroud)

哎哟.512kb的字节是一个基本限制吗?是否有现有JSON模块的高容量替代品?


更新:它是一些数据的错误,因为尝试编码*biz_list [2126:]*会导致立即错误.这是令人讨厌的部分:

'2楼,Gurumadhavendra塔,\nKadavanthra路,Kaloor,\nCochin \ x96 682 017'

如何配置它以便可以编码为JSON?


更新2:答案按预期工作:数据来自以"latin-1-swedish-ci"编码的MySQL表.我在一个随机数字中看到了重要性.很抱歉在诊断故障时自发地引导标题作者的精神.

YOU*_*YOU 14

很简单,如果您的数据不在utf-8中,请不要使用utf-8编码

>>> json.loads('["\x96"]')
....
UnicodeDecodeError: 'utf8' codec can't decode byte 0x96 in position 0: invalid start byte

>>> json.loads('["\x96"]', encoding="latin-1")
[u'\x96']
Run Code Online (Sandbox Code Playgroud)

json.loads

如果sstr实例并且使用除utf-8之外的基于ASCII的编码(例如,latin-1)进行编码,则encoding必须指定适当的 名称.不允许非基于ASCII的编码(例如UCS-2),应unicode首先将其解码 .

编辑:要获得正确的unicode值"\ x96",请使用"cp1252",如Eli Collins所述

>>> json.loads('["\x96"]', encoding="cp1252")
[u'\u2013']
Run Code Online (Sandbox Code Playgroud)

  • 只是为了挑剔 - latin-1没有为\ x96定义一个字符,尽管python编解码器会自愿解码它(但是作为原始字节值,而不是特定字符).正确的编解码器可能是cp1252(microsoft的latin-1扩展),它将byte\x96定义为unicode char 2012(en-dash).几乎任何具有一堆\ x90-\x9F字符的ascii外观编码都可能是cp1252,因为windows系统会产生很多这些字符(智能引号等). (3认同)