2010-02-10 25 views
15

¿Cuál es la mejor manera de cargar cadenas JSON en Python?Analizando la entrada Unicode usando python json.loads

Quiero usar json.loads para procesar Unicode como esto:

import json 
json.loads(unicode_string_to_load) 

También probé el suministro de 'Codificación' parámetro con el valor 'UTF-16', pero el error no desapareció.

SSCCE completa con el error:

# -*- 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 

error:

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

¿Tiene usted algún datos de origen que muestra el ¿problema? –

+1

Aparece este error. (UnicodeDecodeError: el códec 'utf16' no puede decodificar el byte 0x38 en la posición 6: datos truncados) Utilizo este comando: json.loads (response, encoding = 'utf-16'). Secuencialmente, este error viene para muchos caracteres Unicode ... –

+1

..... Creo que necesitamos tener una pequeña discusión sobre lo que significa "datos de origen" ... –

Respuesta

6

Los aclara OP (en un comentario!) ...:

Source data is huge unicode encoded string

entonces usted tiene que saber que de las muchas codificaciones Unicode que utiliza - claramente no 'utf-16', ya que eso falló, b Pero hay muchos otros: 'utf-8', 'iso-8859-15', y así sucesivamente. Puedes probarlos todos hasta que uno funcione, o print repr(str_to_load[:80]) y pegar lo que se muestra como una edición de tu pregunta, ¡así podemos adivinar en tu nombre! -).

+0

Es difícil identificar una codificación particular durante la carga porque los datos de origen pueden contener caracteres de varios idiomas del mundo. ¿Hay alguna forma de detectar el tipo de codificación? –

+0

str_to_load sigue cambiando, utf-8 funcionó para algunos, utf-32 funcionó para algunos ... pero ¿cómo lo detecto automáticamente? –

+0

Esa cadena es '{"exitosa": verdadera, "datos": [76, {"posting_id": "1753178", "site_tender_id": "3188446' –

8

I typecasting la cadena en cadena Unicode utilizando 'latino-1' fijo el error:

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

Código fijo:

import json 

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

json.loads(ustr_to_load) 

Y a continuación, el error no se lanza.

+5

BTW,' latin-1' es el nombre antiguo para 'iso -8859-1' y en estos días es mucho más probable que vea 'iso-8859-15' - el onl La diferencia es que este último incluye el símbolo del euro. Si decodifica con '-1' y la cadena estaba codificada con' -15', generalmente estará bien, pero los signos del euro se verán muy peculiares cuando los imprima o los muestre. –

+0

Gracias Alex. Lo cambié a 'iso-8859-15' ... –

+0

+1 para usted señor bueno – KJW

2

Con django puede usar SimpleJSON y usar cargas en lugar de solo cargar.

from django.utils import simplejson 

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

esto ya no funciona en django ya que usa el valor predeterminado que viene con python – Griff