【问题标题】:Python JSON decoder error with unicode characters in request content请求内容中带有 unicode 字符的 Python JSON 解码器错误
【发布时间】:2019-07-14 00:33:50
【问题描述】:

使用 requests 库执行返回 JSON 响应的 http GET 当响应字符串包含 unicode char 时出现此错误:

json.decoder.JSONDecodeError: Invalid control character at: line 1 column 20 (char 19)

使用 Postman 执行相同的 http 请求,json 输出为:

{ "value": "VILLE D\u0019ANAUNIA" }

我的python代码是:

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

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

【问题讨论】:

标签: python json python-3.x


【解决方案1】:

这可能是由右单引号 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 DANAUNIA'}

或者,您可以用空格替换所有不需要的字符:

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)

你会得到{'value': 'VILLE D ANAUNIA'}

【讨论】:

  • 感谢您的建议!现在我不需要替换 unicode 字符,但也许它在未来会有用!
【解决方案2】:

以下代码适用于 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'}

还有一点就是requests get返回的数据是json:

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

【讨论】:

  • 使用参数 strict=False 没有抛出异常!谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-27
  • 2015-02-03
  • 2011-07-18
  • 1970-01-01
  • 1970-01-01
  • 2019-07-26
相关资源
最近更新 更多