У меня есть внешняя служба, которая отправляет мне следующий json:
json_str = b'{"a": "\xc3-----\xa4-----\x13"}'
Когда я пытаюсь разобрать его, я получаю следующую ошибку:
----> 1 json.loads(json_str)
ValueError: Invalid control character at: line 1 column 20 (char 19)
Мне удалось правильно разобрать его с помощью следующей команды:
In [37]: eval(json_str)
Out[37]: {'a': '\xc3-----\xa4-----\x13'}
Есть идеи, как его разобрать по-другому?
eval «работает» только потому, что байты являются допустимым выражением Python в дополнение к кодировке допустимого выражения JSON.
Да, теперь я вижу, как с этим бороться. До этого я правильно разбирал без расшифровки и эти символы меня смущали.
Обратите внимание, что ошибка относится к одному управляющему символу, представленному \x13, который нельзя использовать непосредственно в значении JSON.






Я нашел способ, используя .decode и функции json.loads.
Надеюсь это поможет.
>>> json.loads(json_str.decode("latin-1"), strict=False)
{u'a': u'\xc3-----\xa4-----\x13'}
Вывод по-прежнему находится в юникод
использованная литература
Спасибо! Похоже то что мне нужно
JSON по определению является текстом Unicode. Если у вас есть строка байтов, вам нужно сначала декодировать ее, чтобы получить строку Unicode, которую вы можете проанализировать как JSON. Python очень строго относится к разнице между байтами и строками, даже если сопоставление между ними тривиально.