Анализ ввода Unicode с использованием python json.loads

Каков наилучший способ загрузки JSON-строк в Python?

Я хочу использовать json.loads для обработки unicode следующим образом:

import json
json.loads(unicode_string_to_load)

Я также попытался поставить параметр "encoding" со значением "utf-16", но ошибка не исчезла.

Полный SSCCE с ошибкой:

# -*- coding: utf-8 -*-
import json
value = '{"foo" : "bar"}'
print(json.loads(value)['foo'])     #This is correct, prints 'bar'

some_unicode = unicode("degradé")  
#last character is latin e with acute "\xe3\xa9"
value = '{"foo" : "' + some_unicode + '"}'
print(json.loads(value)['foo'])            #incorrect, throws error

Ошибка:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 
6: ordinal not in range(128)

Ответ 1

Я приписываю строку в строку юникода, используя "latin-1", исправил ошибку:

UnicodeDecodeError: 'utf16' codec can't decode byte 0x38 in 
position 6: truncated data

Фиксированный код:

import json

ustr_to_load = unicode(str_to_load, 'latin-1')

json.loads(ustr_to_load)

И тогда ошибка не выбрасывается.

Ответ 2

OP разъясняет (в комментарии!)...:

Исходные данные огромны в кодировке в кодировке Юникод строка

Затем вы должны знать , который для многих кодировок Юникода, которые он использует, - явно не "utf-16", поскольку это не удалось, но есть так много других - "utf-8", 'iso-8859-15' и т.д. Вы либо попробуйте их все, пока не сработаете, либо print repr(str_to_load[:80]) и вставьте то, что он показывает, как редактирование вашего вопроса, поэтому мы можем догадаться от вашего имени! -).

Ответ 3

Самый простой способ, который я нашел, -

import simplejson as json

таким образом ваш код останется тем же самым

json.loads(str_to_load)

ссылка: https://simplejson.readthedocs.org/en/latest/

Ответ 4

С помощью django вы можете использовать SimpleJSON и использовать нагрузки вместо загрузки.

from django.utils import simplejson

simplejson.loads(str_to_load, "utf-8")