Python json.loads失败,出现`ValueError:无效的控制字符:第1行第33列(字符33)`

福气鱼*_*福气鱼 42 python json

我有一个像这样的字符串:

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"}"""
Run Code Online (Sandbox Code Playgroud)

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

ValueError: Invalid control character at: line 1 column 33 (char 33)
Run Code Online (Sandbox Code Playgroud)

为什么会出现此错误?我怎么解决这个问题?

drp*_*poo 101

也许另一个选择是使用这个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)
Run Code Online (Sandbox Code Playgroud)

  • 这是一个更好的选择,因为 json 标准允许很少的控制字符。 (5认同)
  • 我同意@shadow0359,这是更好的选择。 (2认同)

Tho*_*ers 59

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

如果您无法修复获得此JSON字符串以生成有效JSON的位置,则可以删除有问题的字符:

>>> json.loads(s.replace('\r\n', ''))
Run Code Online (Sandbox Code Playgroud)

或手动转义:

>>> json.loads(s.replace('\r\n', '\\r\\n'))
Run Code Online (Sandbox Code Playgroud)


use*_*450 11

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

>>> s[33]
u'\r'
Run Code Online (Sandbox Code Playgroud)

根据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'}
Run Code Online (Sandbox Code Playgroud)

参考文献:

  • 如果字符串在变量中怎么办?例如,我正在接收(通过HTTP POST)这样的JSON对象:`{"text":"你好,\n你好吗?"}`.我显然不能用`r''来制作一个原始字符串.我怎么能让Python这样对待它,或者为时已晚,现在我需要使用某种字符串替换? (2认同)

Bog*_*dan 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'}
Run Code Online (Sandbox Code Playgroud)