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
请求内容中包含unicode字符的Python JSON解码器错误_Python_Json_Python 3.x - Fatal编程技术网

请求内容中包含unicode字符的Python JSON解码器错误

请求内容中包含unicode字符的Python JSON解码器错误,python,json,python-3.x,Python,Json,Python 3.x,使用请求库执行返回JSON响应的http GET,当响应字符串包含unicode字符时,我会遇到以下错误: json.decoder.JSONDecodeError: Invalid control character at: line 1 column 20 (char 19) 与邮递员执行相同的http请求。json输出为: { "value": "VILLE D\u0019ANAUNIA" } 我的python代码是: data = requests.get(uri, headers=

使用请求库执行返回JSON响应的http GET,当响应字符串包含unicode字符时,我会遇到以下错误:

json.decoder.JSONDecodeError: Invalid control character at: line 1 column 20 (char 19)
与邮递员执行相同的http请求。json输出为:

{ "value": "VILLE D\u0019ANAUNIA" }
我的python代码是:

data = requests.get(uri, headers=HEADERS).text
json_data = json.loads(data)

在使用json.loads(…)执行转换之前,是否可以删除或替换所有Unicode字符?

以下代码适用于python 2.7:

import json
d = json.loads('{ "value": "VILLE D\u0019ANAUNIA" }')
print(d)

以下代码适用于python 3.7:

import json
d = json.loads('{ "value": "VILLE D\u0019ANAUNIA" }', strict=False)
print(d)
输出:

{u'value': u'VILLE D\x19ANAUNIA'}
另一点是请求get以json的形式返回数据:

r = requests.get('https://api.github.com/events')
r.json()

这可能是由右单引号U+2019(
)引起的。由于我猜不出的原因,高阶字节被删除,留下了一个控制字符,应该以正确的JSON字符串进行转义

因此,正确的方法是控制API返回的确切内容。如果id确实返回
'\u0019'
控制字符,则应联系API所有者,因为问题应该存在

作为一种解决方法,您可以尝试通过过滤掉非ascii或控制字符来限制处理问题:

data = requests.get(uri, headers=HEADERS).text
data = ''.join((i for i in data if 0x20 <= ord(i) < 127))  # filter out unwanted chars
json_data = json.loads(data)

您将获得
{'value':'VILLE D ANAUNIA'}

查看此选项是否有助于或可能复制原始响应内容(
print(requests.get(uri,headers=headers.content)
)?这可能是由编码问题引起的…参数strict=False时未引发异常!谢谢汉克的建议!现在我不需要替换unicode字符,但将来可能会有用!
data = requests.get(uri, headers=HEADERS).text
data = ''.join((i if 0x20 <= ord(i) < 127 else ' ' for i in data))
json_data = json.loads(data)