web-dev-qa-db-fra.com

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

Je vais recevoir une forme de chaîne codée JSON, Obj-C, et je décode une chaîne fictive (pour le moment) comme le code ci-dessous. Ma sortie est accompagnée du 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 l'enlever? 

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
118
janeh

Le préfixe u signifie simplement que vous avez une chaîne Unicode. Lorsque vous utilisez réellement la chaîne, elle n'apparaît pas dans vos données. Ne soyez pas projeté par la sortie imprimée.

Par exemple, essayez ceci:

print mail_accounts[0]["i"]

Vous ne verrez pas un u.

146
Ned Batchelder

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

131
Aman

Led3print ci-dessous est celui que vous recherchez (qui est la combinaison des vidages et des charges) :)

Ayant:

import json

d = """{"Aa": 1, "BB": "blabla", "cc": "False"}"""

d1 = json.loads(d)              # Produces a dictionary out of the given string
d2 = json.dumps(d)              # Produces a string out of a given dict or string
d3 = json.dumps(json.loads(d))  # 'dumps' gets the dict from 'loads' this time

print "d1:  " + str(d1)
print "d2:  " + d2
print "d3:  " + d3

Impressions:

d1:  {u'Aa': 1, u'cc': u'False', u'BB': u'blabla'}
d2:  "{\"Aa\": 1, \"BB\": \"blabla\", \"cc\": \"False\"}"
d3:  {"Aa": 1, "cc": "False", "BB": "blabla"}
38
Mercury

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

JSON                    Python
==================================
object                  dict
array                   list
string                  unicode
number (int)            int, long
number (real)           float
true                    True
false                   False
null                    None

"Le codage détermine le codage utilisé pour interpréter les objets str décodés par cette instance (UTF-8 par défaut)."

8
jdi

Le préfixe u signifie que ces chaînes sont unicode plutôt que des chaînes de 8 bits. Le meilleur moyen de ne pas afficher le préfixe u consiste à basculer vers Python 3, où les chaînes sont unicode par défaut. Si ce n'est pas une option, le constructeur str convertira unicode en 8 bits, aussi effectuez simplement une boucle récursive sur le résultat et convertissez unicode en str. Cependant, il est probablement préférable de laisser les chaînes au format Unicode.

6
Abe Karplus

Les 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:

import json, ast
jdata = ast.literal_eval(json.dumps(jdata)) # Removing uni-code chars

Passons à la caisse depuis Shell en python

>>> import json, ast
>>> jdata = [{u'i': u'imap.gmail.com', u'p': u'aaaa'}, {u'i': u'333imap.com', u'p': u'bbbb'}]
>>> jdata = ast.literal_eval(json.dumps(jdata))
>>> jdata
[{'i': 'imap.gmail.com', 'p': 'aaaa'}, {'i': '333imap.com', 'p': 'bbbb'}]
3
Nivesh Krishna

Ce problème persiste lorsque je tente de capturer des données JSON dans le journal avec la bibliothèque Python logging, à des fins de débogage et de dépannage. Obtenir le caractère u est une véritable gêne lorsque vous voulez copier le texte et le coller quelque part dans votre code.

Comme tout le monde vous le dira, cela est dû au fait qu’il s’agit d’une représentation Unicode et que cela pourrait provenir du fait que vous avez utilisé json.loads() pour charger les données d’une chaîne. 

Si vous souhaitez que la représentation JSON dans le journal, sans le préfixe u, l'astuce consiste à utiliser 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'}
0
jonatan