Ошибка кодирования при десериализации объекта json от Google

45
5

В качестве упражнения я построил небольшую script, которая запрашивает Google Suggest JSON API. Код довольно прост:


query = 'a'
url = "http://clients1.google.co.jp/complete/search?hl=ja&q=%s&json=t" %query
response = urllib.urlopen(url)
result = json.load(response)
UnicodeDecodeError: 'utf8' codec can't decode byte 0x83 in position 0: invalid start byte

Если я попробую read() объект ответа, это то, что у меня есть:


'["a",["amazon","ana","au","apple","adobe","alc","\x83A\x83}\x83]\x83\x93","\x83A\x83\x81\x83u\x83\x8d","\x83A\x83X\x83N\x83\x8b","\x83A\x83\x8b\x83N"],["","","","","","","","","",""]]'

Таким образом, это означает, что ошибка возникает, когда python пытается декодировать строку. Это происходит только с google.co.jp и японским языком. Я пробовал один и тот же код с разными версиями contry/languages, и я не получал ту же проблему: когда я пытаюсь десериализовать объект, все работает нормально.


    Я проверил заголовки ответов, и они всегда указывают utf-8 как кодировку ответа.
    Я проверил строку JSON с онлайн-парсером (http://json.parser.online.fr/) и снова все швы OK

Любые идеи для решения этой проблемы? Что делает функцию JSON load() дроссельной заслонкой?


Спасибо заранее.

спросил(а) 2010-12-07T16:46:00+03:00 9 лет назад
2
Решение
64

Заголовок ответа (print response.header) содержит следующую информацию:


Content-Type: text/javascript; charset=Shift_JIS

Обратите внимание на кодировку.

Если вы укажете эту кодировку в json.load, она будет работать:


result = json.load(response, encoding='shift_jis')

ответил(а) 2010-12-07T17:16:00+03:00 9 лет назад
Еще 1 ответ
32

Независимо от того, что говорит спецификация, строка "\ x83A\x83}\x83]\x83\x93" не является UTF-8.

В предположении, что это один из [ "cp932", "shift_jis", "shift_jis_2004", "shift_jisx0213" ]; попробуйте декодировать как один из них.

ответил(а) 2010-12-07T17:37:00+03:00 9 лет назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема