2010-02-10 16 views
15

Qual è il modo migliore per caricare le stringhe JSON in Python?Parsing input unicode usando python json.loads

voglio usare json.loads per elaborare Unicode come questo:

import json 
json.loads(unicode_string_to_load) 

Ho provato anche la fornitura di 'encoding' parametro con valore 'utf-16', ma l'errore non è andato via.

SSCCE completa con l'errore:

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

Errore:

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

Avete qualche dati di origine che mostra il problema? –

+1

Ho ricevuto questo errore. (UnicodeDecodeError: codec 'utf16' non può decodificare byte 0x38 in posizione 6: dati troncati) uso questo comando: json.loads (risposta, encoding = 'utf16'). In sequenza questo errore si presenta per molti caratteri Unicode ... –

+1

..... Penso che dovremmo avere una piccola discussione su cosa significhi "dati sorgente" ... –

risposta

6

Le chiarisce OP (in un commento!) ...:

Source data is huge unicode encoded string

allora dovete sapere quale delle numerose codifiche Unicode che utilizza - chiaramente non "utf-16", poiché ciò non è riuscito, b ci sono così tanti altri - 'utf-8', 'iso-8859-15', e così via. Provali tutti fino a quando uno funziona, o print repr(str_to_load[:80]) e incolla ciò che mostra come una modifica della tua domanda, quindi possiamo indovinarlo a tuo nome! -).

+0

È difficile identificare una particolare codifica durante il caricamento perché i dati di origine possono contenere caratteri di varie lingue del mondo. C'è un modo per rilevare il tipo di codifica? –

+0

str_to_load continua a cambiare, utf-8 ha funzionato per alcuni, utf-32 ha funzionato per alcuni ... ma come faccio a rilevarlo automaticamente? –

+0

Quella stringa è "{" riuscita ": true," data ": [76, {" posting_id ":" 1753178 "," site_tender_id ":" 3188446 ' –

8

ho typecasting la stringa in stringa Unicode utilizzando 'latin-1' corretto l'errore:

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

codice fisso:

import json 

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

json.loads(ustr_to_load) 

E poi l'errore non viene generata.

+5

BTW,' latin-1' è il vecchio nome di 'iso -8859-1' e in questi giorni è molto più probabile vedere 'iso-8859-15' - l'onl la differenza è che quest'ultimo include il simbolo dell'euro. Se decodificate con '-1' e la stringa è stata codificata con' -15', sarà per lo più OK, ma i segni dell'euro appariranno molto particolari quando li stamperete o li mostrerete. –

+0

Grazie Alex. L'ho cambiato in 'iso-8859-15' .... –

+0

+1 per te bravo signore – KJW

2

Con django è possibile utilizzare SimpleJSON e utilizzare carichi anziché solo caricare.

from django.utils import simplejson 

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

questo non funziona più in django in quanto usa il default che viene fornito con python – Griff