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
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.
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
Derd3
print 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"}
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)."
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.
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'}]
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'}