171 votes

Python : json.loads retourne les éléments préfixés par 'u'.

Je vais recevoir une chaîne encodée en JSON depuis Obj-C, et je décode une chaîne factice (pour l'instant) comme le code ci-dessous. Ma sortie contient le caractère 'u' en préfixe de 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

8voto

Abe Karplus Points 2233

El u signifie que ces chaînes sont unicode plutôt que des chaînes de 8 bits. La meilleure façon de ne pas afficher le u est de passer à Python 3, où les chaînes de caractères sont unicode par défaut. Si ce n'est pas une option, la fonction str convertira l'unicode en 8 bits, donc il suffit de boucler récursivement sur le résultat et de convertir unicode a str . Cependant, il est probablement préférable de laisser les chaînes de caractères en unicode.

4voto

jonatan Points 3860

J'ai rencontré ce problème en essayant de capturer des données JSON dans le journal avec la méthode Python. logging à des fins de débogage et de dépannage. Obtenir le u est un véritable fléau lorsque vous voulez 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 pourrait 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 l'option u l'astuce consiste à utiliser le préfixe json.dumps() avant de le déconnecter. Par exemple :

import json
import logging

# Prepare the data
json_data = json.loads('{"key": "value"}')

# Log normally and get the Unicode indicator
logging.warning('data: {}'.format(json_data))
>>> WARNING:root:data: {u'key': u'value'}

# Dump to a string before logging and get clean output!
logging.warning('data: {}'.format(json.dumps(json_data)))
>>> WARNING:root:data: {'key': 'value'}

2voto

2nd Sight Lab Points 11

Essayez ça :

comptes_mails[0].encode("ascii")

-3voto

Mikematic Points 122

Il suffit de remplacer le "u" par un guillemet simple...

print (str.replace(mail_accounts,"u'","'"))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X