web-dev-qa-db-fra.com

Analyse de l'entrée Unicode en utilisant python Json.loads

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)
17
Software Enthusiastic

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.

9
Software Enthusiastic

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! -).

6
Alex Martelli

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)

référence: https://simplejson.readthedocs.org/fr/Latest/

5
jeremyforan

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")
1
Hussein Ahmed