Используя библиотеку запросов для выполнения http GET, который возвращает ответ JSON, я получаю эту ошибку, когда строка ответа содержит символ unicode:
json.decoder.JSONDecodeError: Invalid control character at: line 1 column 20 (char 19)
Выполните тот же http-запрос с Postman, вывод json:
{ "value": "VILLE D\u0019ANAUNIA" }
Мой код Python:
data = requests.get(uri, headers=HEADERS).text
json_data = json.loads(data)
Могу ли я удалить или заменить все символы Unicode перед выполнением преобразования с помощью json.loads(...)?
Возможный дубликат stackoverflow.com/questions/27955978/…
Каково необработанное содержание ответа (print(requests.get(uri, headers=HEADERS).content))? Это может быть вызвано проблемой с кодировкой...






Код ниже работает на 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'}
Другой момент заключается в том, что запросы возвращают данные в виде json:
r = requests.get('https://api.github.com/events')
r.json()
С параметром strict=False исключений не возникало! Спасибо
Скорее всего, это вызвано ПРАВИЛЬНОЙ ОДИНАРНОЙ КАВАЧКОЙ 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'}
Спасибо за предложение! На данный момент мне не нужно заменять символы Юникода, но, возможно, это может быть полезно в будущем!
посмотрите, поможет ли это stackoverflow.com/questions/15321138/… или stackoverflow.com/questions/2234228/…