Python json.loads失败,返回“ValueError:Invalid control character at:line 1 column 33(char 33)”`

2024-05-19 10:22:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一根这样的绳子:

s = u"""{"desc": "\u73cd\u54c1\u7f51-\u5168\u7403\u6f6e\u6d41\u5962\u54c1\u7f51\u7edc\u96f6\u552e\u5546 <br \/>\r\nhttp:\/\/www.zhenpin.com\/ <br \/>\r\n<br \/>\r\n200\u591a\u4e2a\u56fd\u9645\u4e00\u7ebf\u54c1\u724c\uff0c\u9876\u7ea7\u4e70\u624b\u5168\u7403\u91c7\u8d2d\uff0c100%\u6b63\u54c1\u4fdd\u969c\uff0c7\u5929\u65e0\u6761\u2026"}"""

json.loads(s)返回如下错误消息:

ValueError: Invalid control character at: line 1 column 33 (char 33)

为什么会发生这个错误?我怎样才能解决这个问题?


Tags: br错误desc绳子u73cdu7edcu6f6eu6d41
3条回答

问题是unicode字符串在JSON数据的字符串文本中包含回车(\r)和换行(\n。如果它们是字符串本身的一部分,则应该适当地进行转义。如果它们不是字符串的一部分,那么它们也不应该在JSON中。

如果无法修复从何处获取此JSON字符串以生成有效的JSON,则可以删除有问题的字符:

>>> json.loads(s.replace('\r\n', ''))

或者手动逃离它们:

>>> json.loads(s.replace('\r\n', '\\r\\n'))

另一种选择可能是使用strict=False参数

根据http://docs.python.org/2/library/json.html

“如果strict为False(默认为True),则字符串中允许使用控制字符。此上下文中的控制字符是那些字符代码在0-31范围内的字符,包括'\t'(制表符)、'\n'、'\r'和'\0'

例如:

json.loads(json_str, strict=False)

问题是索引33处的字符是回车控制字符。

>>> s[33]
u'\r'

根据JSON规范,有效字符为:

  • 任何Unicode字符,除了:"\和控制字符(ord(char) < 32)。

  • 允许以下字符序列:\"\\\/\b(退格)、\f(表单馈送)、\n(换行/换行)、\r(回车)、\t(制表符)或\u后跟四个十六进制数字。

但是,在Python中,必须对控制字符进行双重转义(除非字符串是原始的),因为Python还解释这些控制字符。

>>> s = ur"""{"desc": "\u73cd\u54c1\u7f51-\u5168\u7403\u6f6e\u6d41\u5962\u54c1\u7f51\u7edc\u96f6\u552e\u5546 <br \/>\r\nhttp:\/\/www.zhenpin.com\/ <br \/>\r\n<br \/>\r\n200\u591a\u4e2a\u56fd\u9645\u4e00\u7ebf\u54c1\u724c\uff0c\u9876\u7ea7\u4e70\u624b\u5168\u7403\u91c7\u8d2d\uff0c100%\u6b63\u54c1\u4fdd\u969c\uff0c7\u5929\u65e0\u6761\u2026"}"""
>>> json.loads(s)
{u'desc': u'\u73cd\u54c1\u7f51-\u5168\u7403\u6f6e\u6d41\u5962\u54c1\u7f51\u7edc\u96f6\u552e\u5546 <br />\r\nhttp://www.zhenpin.com/ <br />\r\n<br />\r\n200\u591a\u4e2a\u56fd\u9645\u4e00\u7ebf\u54c1\u724c\uff0c\u9876\u7ea7\u4e70\u624b\u5168\u7403\u91c7\u8d2d\uff0c100%\u6b63\u54c1\u4fdd\u969c\uff0c7\u5929\u65e0\u6761\u2026'}

参考文献:

相关问题 更多 >

    热门问题