webentwicklung-frage-antwort-db.com.de

Python: json.loads gibt Elemente mit dem Präfix 'u' zurück

Ich empfange eine JSON-codierte Zeichenfolge aus Obj-C und decodiere eine Dummy-Zeichenfolge (für den Moment) wie den folgenden Code. Meine Ausgabe wird mit dem Zeichen "u" vor jedem Element ausgegeben: 

[{u'i': u'imap.gmail.com', u'p': u'aaaa'}, {u'i': u'333imap.com', u'p': u'bbbb'}...

Wie fügt JSON dieses Unicode-Zeichen hinzu? Was ist der beste Weg, um es zu entfernen? 

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

Das u-Präfix bedeutet nur, dass Sie eine Unicode-Zeichenfolge haben. Wenn Sie die Zeichenfolge wirklich verwenden, wird sie nicht in Ihren Daten angezeigt. Lassen Sie sich nicht von der Druckausgabe werfen.

Versuchen Sie dies beispielsweise:

print mail_accounts[0]["i"]

Sie werden kein u sehen.

146
Ned Batchelder

Alles ist cool, Mann. Das 'u' ist eine gute Sache, es zeigt an, dass die Zeichenfolge vom Typ Unicode in Python 2.x ist. 

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

131
Aman

Derd3print unten ist der, nach dem Sie suchen (was die Kombination von Dumps und Loads ist) :)

mit:

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

Drucke:

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 ist hier ein geeigneter Typ. Die JSONDecoder-Dokumente beschreiben die Konvertierungstabelle und geben an, dass Json-String-Objekte in Unicode-Objekte decodiert werden

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

"Die Codierung bestimmt die Codierung, die zur Interpretation aller von dieser Instanz dekodierten str-Objekte verwendet wird (standardmäßig UTF-8)."

8
jdi

Das Präfix u bedeutet, dass diese Zeichenfolgen Unicode-Zeichen und nicht 8-Bit-Zeichenfolgen sind. Der beste Weg, das Präfix u nicht anzuzeigen, besteht darin, zu Python 3 zu wechseln, wo Zeichenfolgen standardmäßig Unicode sind. Wenn dies keine Option ist, konvertiert der Konstruktor str von Unicode in 8-Bit. Führen Sie einfach eine Schleife über das Ergebnis aus und konvertieren Sie unicode in str. Es ist jedoch wahrscheinlich am besten, die Zeichenfolgen als Unicode zu belassen.

6
Abe Karplus

Die an ein Objekt angehängten 'u'-Zeichen geben an, dass das Objekt in "Unicode" codiert ist. 

Wenn Sie diese 'u'-Zeichen von Ihrem Objekt entfernen möchten, können Sie Folgendes tun:

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

Lassen Sie uns von Python Shell auschecken

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

Beim Versuch, JSON-Daten im Protokoll mit der Python-Bibliothek logging zu erfassen, bin ich ständig auf dieses Problem gestoßen, um Fehler zu beheben und Fehler zu beheben. Das u-Zeichen zu erhalten, ist ein echtes Ärgernis, wenn Sie den Text kopieren und irgendwo in Ihren Code einfügen möchten.

Wie jeder sagen wird, liegt dies daran, dass es sich um eine Unicode-Darstellung handelt, und dies könnte darauf zurückzuführen sein, dass Sie json.loads() verwendet haben, um die Daten überhaupt aus einem String zu laden. 

Wenn Sie die JSON-Darstellung im Protokoll ohne das Präfix u möchten, besteht der Trick darin, json.dumps() zu verwenden, bevor Sie sich abmelden. Zum Beispiel:

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