我有一个这样的字符串:
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)
为什么会出现此错误?我该如何解决这个问题?
答案 0 :(得分:95)
另一种选择可能是使用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)
答案 1 :(得分:57)
问题是你的unicode字符串包含回车符(\r
)和换行符(\n
)在中的JSON数据中的字符串文字。如果它们本身就是字符串本身的一部分,那么它们应该被适当地转义。如果它们不是字符串的一部分,它们也不应该在你的JSON中。
如果您无法修复获取此JSON字符串以生成有效JSON的位置,则可以删除有问题的字符:
>>> json.loads(s.replace('\r\n', ''))
或手动转义:
>>> json.loads(s.replace('\r\n', '\\r\\n'))
答案 2 :(得分:11)
问题是索引33处的字符是回车控制字符。
>>> s[33]
u'\r'
根据JSON规范,有效字符为:
除"
,\
和控制字符(ord(char) < 32
)之外的任何Unicode字符。
允许使用以下字符序列:\"
,\\
,\/
,\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'}
参考文献:
答案 3 :(得分:7)
尝试逃避\n
和\r
:
s = s.replace('\r', '\\r').replace('\n', '\\n')
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'}
答案 4 :(得分:0)
在某些情况下,当文件实际包含其中包含空格的字符串时,将引发此错误。删除空格将解决问题。