Je vais recevoir une chaîne codée JSON sous la forme Obj-C, et je décode une chaîne factice (pour l'instant) comme le code ci-dessous. Ma sortie sort avec le caractère 'u' préfixant chaque élément:
[{u'i': u'imap.gmail.com', u'p': u'aaaa'}, {u'i': u'333imap.com', u'p': u'bbbb'}...
Comment JSON ajoute-t-il ce caractère unicode? Quelle est la meilleure façon de le supprimer?
mail_accounts = []
da = {}
try:
s = '[{"i":"imap.gmail.com","p":"aaaa"},{"i":"imap.aol.com","p":"bbbb"},{"i":"333imap.com","p":"ccccc"},{"i":"444ap.gmail.com","p":"ddddd"},{"i":"555imap.gmail.com","p":"eee"}]'
jdata = json.loads(s)
for d in jdata:
for key, value in d.iteritems():
if key not in da:
da[key] = value
else:
da = {}
da[key] = value
mail_accounts.append(da)
except Exception, err:
sys.stderr.write('Exception Error: %s' % str(err))
print mail_accounts
Réponses:
Le préfixe u signifie simplement que vous avez une chaîne Unicode. Lorsque vous utilisez vraiment la chaîne, elle n'apparaîtra pas dans vos données. Ne soyez pas renversé par la sortie imprimée.
Par exemple, essayez ceci:
Vous ne verrez pas de u.
la source
u
s dans vos données. Franchement, imprimer unu
pour indiquer qu'il s'agit d'une chaîne Unicode est l'une des pires erreurs concernant Python. Absolument ridicule. Pourquoi ne pas imprimer unea
avant chaque chaîne si elle est ASCII? Eti
si c'est un entier?Tout est cool, mec. Le 'u' est une bonne chose, il indique que la chaîne est de type Unicode en python 2.x.
http://docs.python.org/2/howto/unicode.html#the-unicode-type
la source
L'
d3
impression ci-dessous est celle que vous recherchez (qui est la combinaison de décharges et de charges) :)Ayant:
Impressions:
la source
json.dumps
convertit le dict en une chaîne (codée JSON). Ce n'est pas ce que le PO voulait faire. -1.Le
u
préfixe signifie que ces chaînes sont unicode plutôt que des chaînes de 8 bits. La meilleure façon de ne pas afficher leu
préfixe est de passer à Python 3, où les chaînes sont unicode par défaut. Si ce n'est pas une option, lestr
constructeur convertira de Unicode en 8 bits, il suffit donc de boucler récursivement sur le résultat et de le convertirunicode
enstr
. Cependant, il est probablement préférable de laisser les chaînes au format Unicode.la source
Unicode est un type approprié ici. La documentation JSONDecoder décrit la table de conversion et indique que les objets chaîne json sont décodés en objets Unicode
https://docs.python.org/2/library/json.html#encoders-and-decoders
"l'encodage détermine l'encodage utilisé pour interpréter les objets str décodés par cette instance (UTF-8 par défaut)."
la source
Ces caractères «u» ajoutés à un objet signifient que l'objet est codé en «unicode».
Si vous souhaitez supprimer ces caractères «u» de votre objet, vous pouvez le faire:
Vérifions à partir du shell python
la source
J'ai continué à rencontrer ce problème en essayant de capturer des données JSON dans le journal avec la
logging
bibliothèque Python , à des fins de débogage et de dépannage. Obtenir leu
caractère est une véritable nuisance lorsque vous souhaitez copier le texte et le coller quelque part dans votre code.Comme tout le monde vous le dira, c'est parce qu'il s'agit d'une représentation Unicode, et cela peut venir du fait que vous avez utilisé
json.loads()
pour charger les données à partir d'une chaîne en premier lieu.Si vous voulez la représentation JSON dans le journal, sans le
u
préfixe, l'astuce consiste à utiliserjson.dumps()
avant de la déconnecter. Par exemple:la source
Essaye ça:
mail_accounts [0] .encode ("ascii")
la source
Remplacez simplement le u par un guillemet simple ...
la source