2010-02-10 4 views
15

Каков наилучший способ загрузки строк JSON в Python?Разбор ввода Unicode с использованием python json.loads

Я хочу использовать json.loads обрабатывать юникод, как это:

import json 
json.loads(unicode_string_to_load) 

Я также попытался поставлять «» кодирующую параметр со значением «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) 
+0

Есть ли у вас какие-либо исходные данные, которые показывает проблема? –

+1

Я получаю эту ошибку. (UnicodeDecodeError: 'utf16' кодек не может декодировать байт 0x38 в позиции 6: усеченные данные) Я использую эту команду: json.loads (response, encoding = 'utf-16'). Sequencly эта ошибка возникает для многих символов Unicode ... –

+1

..... Я думаю, нам нужно немного рассказать о том, что означает «исходные данные» ... –

ответ

6

В ОП проясняет (в комментариях!) ...:

Source data is huge unicode encoded string

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

+0

Трудно определить конкретное кодирование во время загрузки, поскольку исходные данные могут содержать символы с разных языков мира. Есть ли способ определить тип кодировки? –

+0

str_to_load продолжает меняться, utf-8 работал для некоторых, utf-32 работал для некоторых ... но как его автоматически обнаружить? –

+0

Эта строка является «{« success »: true,« data »: [76, {" posting_id ":" 1753178 "," site_tender_id ":" 3188446 ' –

8

Я типажей строку в юникод строку, используя 'латино-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) 

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

+5

BTW,' latin-1' - это старое название 'iso -8859-1', и в эти дни вы, скорее всего, увидите 'iso-8859-15' - onl разница заключается в том, что последний включает в себя знак Euro. Если вы декодируете с '-1', а строка была закодирована с' -15', это будет в основном нормально, но знаки Euro будут выглядеть очень странно, когда вы распечатываете или показываете их. –

+0

Спасибо Алекс. Я изменил его на «iso-8859-15» .... –

+0

+1 для вас хороший sir – KJW

2

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

from django.utils import simplejson 

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

это больше не работает в django, так как использует значение по умолчанию, которое поставляется с python – Griff

Смежные вопросы