Quelle est la meilleure façon de charger des chaînes JSON à Python?
Je veux utiliser json.loads pour traiter UNICODE comme ceci:
import json
json.loads(unicode_string_to_load)
J'ai également essayé de fournir un paramètre "codage" avec la valeur "utf-16", mais l'erreur n'est pas sortie.
SSCCE complète avec erreur:
# -*- 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
Erreur:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position
6: ordinal not in range(128)
Je bloque la chaîne dans une chaîne unicode à l'aide de 'Latin-1' Correction de l'erreur:
UnicodeDecodeError: 'utf16' codec can't decode byte 0x38 in
position 6: truncated data
Code fixe:
import json
ustr_to_load = unicode(str_to_load, 'latin-1')
json.loads(ustr_to_load)
Puis l'erreur n'est pas lancée.
L'OP clarifie (dans un commentaire!) ...:
Les données source sont énormes chaîne codée unicode
Ensuite, vous devez savoir qui des nombreux codages Unicode qu'il utilise - clairement pas "UTF-16", car cela a échoué, mais il y en a tellement d'autres - 'UTF-8', 'ISO -8859-15 ', et ainsi de suite. Vous les essayez tous jusqu'à ce que l'on fonctionne, ou print repr(str_to_load[:80])
et coller ce qu'il montre comme édition de votre question, afin que nous puissions deviner votre nom! -).
La façon la plus simple que j'ai trouvée est
import simplejson as json
de cette façon, votre code reste le même
json.loads(str_to_load)
Avec Django Vous pouvez utiliser SimpleJson et utiliser des charges au lieu de simplement charger.
from Django.utils import simplejson
simplejson.loads(str_to_load, "utf-8")