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

179voto

Ned Batchelder Points 128913

Le préfixe u- signifie simplement que vous avez une chaîne Unicode. Lorsque vous utiliserez réellement la chaîne, elle n'apparaîtra pas dans vos données. Ne vous laissez pas déconcerter par la sortie imprimée.

Par exemple, essayez ceci :

print mail_accounts[0]["i"]

Vous ne verrez pas d'unité.

161voto

Aman Points 3440

Tout est cool, mec. Le 'u' est une bonne chose, il indique que la chaîne est de type Unicode dans python 2.x.

http://docs.python.org/2/howto/unicode.html#the-unicode-type

59voto

Mercury Points 2608

El d3 L'impression ci-dessous est celle que vous recherchez (qui est la combinaison de dumps et de 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

Imprimés :

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"}

11voto

Nivesh Krishna Points 123

Ces caractères "u" ajoutés à un objet signifient que l'objet est codé en "unicode".

Si vous voulez supprimer les caractères "u" de votre objet, vous pouvez le faire :

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

Vérifions à partir du shell 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'}]

10voto

jdi Points 38029

Unicode est un type approprié ici. La documentation de JSONDecoder décrit la table de conversion et indique que les objets de type chaîne de caractères 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

"L'encodage détermine l'encodage utilisé pour interpréter tout objet str décodé par cette instance (UTF-8 par défaut)."

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