Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python json.loads失败,并在第1行第33列(char 33)处显示“ValueError:无效控制字符”`_Python_Json - Fatal编程技术网

Python json.loads失败,并在第1行第33列(char 33)处显示“ValueError:无效控制字符”`

Python json.loads失败,并在第1行第33列(char 33)处显示“ValueError:无效控制字符”`,python,json,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

我有这样一个字符串:

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"}"""
ValueError: Invalid control character at: line 1 column 33 (char 33)

为什么会发生这种错误?如何解决此问题?

请尝试避开您的
\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'}
s=s.replace('\r','\\r')。replace('\n','\\n'))
json.load(s)
>>>{u'desc':u'\u73cd\u54c1\u7f51-\u5168\u7403\u6f6e\u6d41\u5962\u54c1\u7f51\u7edc\u96f6\u552e\u5546
\r\nhttp://www.zhenpin.com/
\r\n
\r\n200\u591a\u4e2a\u56fd\u9645\u4e00\u7ebf\u54c1\u724c\uff0c\u9876\u7ea7\u4e70\u624b\u5168\u7403\u91c7\u8d2d\uff0c100%\u6b63\u54c1\u4fdd\u969c\uff07\u5929\u65e0\u6761\u026'}
问题在于您的unicode字符串在JSON数据的字符串文本中包含回车(
\r
)和换行(
\n
)。如果它们是字符串本身的一部分,则应该对它们进行适当的转义。如果它们不是字符串的一部分,那么它们也不应该出现在JSON中

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

>>> json.loads(s.replace('\r\n', ''))
或者手动退出:

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

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

>>> s[33]
u'\r'
根据JSON规范,有效字符为:

  • 除了:
    \
    和控制字符(
    ord(char)<32
    )之外的任何Unicode字符

  • 允许使用以下字符序列:
    \”
    \
    \//code>、
    \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'}
[代码>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>[u73C73CD CD\u73cd CD\u73cd\u73cd\u54CD\u54CD\u54CD\u54CD\u54CD\u54CD\u54CD\u54CD\u54CD\u54CD\u54CD\u54CD\u5168\u5168\u5168\u5168\u6 6\u6\u6 6 6 6\u6\u66666666666666666666666666666666\u6\u6\u66663\u91c7\u8d2d\uff0c100%\u6b63\u54c1\u4fdd\u969c\uff0c7\u5929\u65e0\u6761\u2026“}” >>>json.load(s) {u'desc':u'\u73cd\u54c1\u7f51-\u5168\u7403\u6f6e\u6d41\u5962\u54c1\u7f51\u7edc\u96f6\u552e\u5546
\r\nhttp://www.zhenpin.com/
\r\n
\r\n200\u591a\u4e2a\u56fd\u9645\u4e00\u7ebf\u54c1\u724c\uff0c\u9876\u7ea7\u4e70\u624b\u5168\u7403\u91c7\u8d2d\uff0c100%\u6b63\u54c1\u4fdd\u969c\uff07\u5929\u65e0\u6761\u026'}
参考资料:


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

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

例如:

json.loads(json_str, strict=False)

在某些情况下,当文件实际包含一个包含空格的字符串时,会引发此错误。删除空白将解决问题。

这可能是我从另一个站点的API获得的部分内容,我不知道是否还有其他无效字符。您知道其他无效字符吗?如果字符串在变量中怎么办?例如,我正在接收(通过HTTP POST)一个JSON对象,如下所示:
{“text”:“你好吗?”}
。很明显,我不能使用
r'
从中生成原始字符串。我怎么能让Python这样对待它呢,还是太晚了,现在我需要使用某种字符串替换?@orokusaki如果您接收的JSON具有文本控制字符而不是正确的字符序列,那么确实太晚了,因为JSON没有正确生成。因此,如果无法控制初始生成,则必须在Python中进行一些字符串替换。感谢您的回复。最后我只是将
strict=False
传递给
loads
,我觉得这可能是一个更干净的解决方案-我们会看看它是否会反过来咬我:/试着重写你的措辞,它在当前的形式下更适合作为注释,并以答案的形式对其进行描述。请描述您认为是什么问题以及您建议的解决方案。但是FWIW,这个答案为我解决了搜索中的错误。登录以为您投票。谢谢Sheldon这是一个更好的选择,因为json标准允许很少的控制字符。我同意@shadow0359,这是一个更好的选择。这节省了我的时间!!更好的选择。