Анализ ввода Unicode с использованием Python json.loads - PullRequest
16 голосов
/ 10 февраля 2010

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

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

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)

Ответы [ 4 ]

9 голосов
/ 10 февраля 2010

Я типизирую строку в строку Unicode, используя '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)

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

6 голосов
/ 10 февраля 2010

ОП уточняет (в комментарии!) ...:

Исходные данные в кодировке Unicode строка

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

5 голосов
/ 07 мая 2015

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

import simplejson as json

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

json.loads(str_to_load)

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

1 голос
/ 04 апреля 2013

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

from django.utils import simplejson

simplejson.loads(str_to_load, "utf-8")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...