Ошибка декодера Python JSON с символами Юникода в содержимом запроса

Используя библиотеку запросов для выполнения 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/15321138/… или stackoverflow.com/questions/2234228/…

Reddysekhar Gaduputi 20.02.2019 11:49

Возможный дубликат stackoverflow.com/questions/27955978/…

skaul05 20.02.2019 11:51

Каково необработанное содержание ответа (print(requests.get(uri, headers=HEADERS).content))? Это может быть вызвано проблемой с кодировкой...

Serge Ballesta 20.02.2019 12:21
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
2 121
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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'}

Другой момент заключается в том, что запросы возвращают данные в виде json:

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

С параметром strict=False исключений не возникало! Спасибо

orion91 20.02.2019 14:57
Ответ принят как подходящий

Скорее всего, это вызвано ПРАВИЛЬНОЙ ОДИНАРНОЙ КАВАЧКОЙ 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'}

Спасибо за предложение! На данный момент мне не нужно заменять символы Юникода, но, возможно, это может быть полезно в будущем!

orion91 20.02.2019 15:00

Другие вопросы по теме