2012-12-18 10 views
89

Ich erhalte eine JSON-codierte String-Form Obj-C, und ich entziffere eine Dummy-Zeichenkette (vorerst) wie der Code unten. Meine Ausgabe kommt mit dem Zeichen "u" vor jedem Element:Python: json.loads gibt Items mit dem Präfix 'u' zurück

[{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 
+6

Python hat einen pr hier ein Problem. Alles ist nicht kalt. Ich bekomme Fehler in den Strings, die Python erstellt, wenn ich versuche, diese Strings in eine Datei zu schreiben. Zum Beispiel, wenn Python "53" von JSON nimmt, verwandelt es sich in u'53 'und versucht, es in eine Datei als Hexadezimalzeichen u' \ xe1 'zu schreiben, was Python dazu bringt, eine vollkommen gute Zeichenkette zu nehmen und zu kotzen: JSON: { "sa_BstDeAv": "53", "sa_BwVUpMx" ... PYTHON: {u'sa_BstDeAv ': u'53', u'sa_BwVUpMx‘... Fehler beim Schreiben: Wert Fehler ('Ascii' Codec kann nicht codieren Zeichen u '\ xe1' in Position 5: Ordnungszahl nicht im Bereich (128)) –

+0

@janehouse die richtige Antwort hier ist die Antwort von JDI ich wirklich denke du solltest es ändern. – Dekel

Antwort

109

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. Nicht durch die gedruckte Ausgabe geworfen werden.

Zum Beispiel, versuchen Sie dies:

print mail_accounts[0]["i"] 

Sie werden keine u sehen.

+2

Ihre Antwort war die nützlichste, die ich bekam, und ich denke, der Fragesteller dieser Frage hätte es sehr geschätzt: http://stackoverflow.com/questions/956867/how-to-get-string-objects-instead-of- -unicode-one-from-json-in-python – jimh

+1

Vielen Dank! Ich war so lange mit dir verwechselt –

105

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

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

+53

Ich mag den sehr chilligen Ton von diesem. +1 für eine (richtige) Antwort, die mich zum Lächeln brachte. – mgilson

+10

Just, chill ... (┛◉┛◉◉) ┻━┻ 彡 ┻━┻ – fuzz

+14

Das war die entspannendste Antwort, die ich auf StackOverflow gelesen habe. – aanrv

3

Die u Präfix bedeutet, dass diese Strings Unicode sind eher als 8-Bit-Strings. Die beste Möglichkeit, das Präfix u nicht anzuzeigen, besteht darin, zu Python 3 zu wechseln, wo Strings standardmäßig Unicode sind. Wenn das keine Option ist, wird der str-Konstruktor von Unicode zu 8-Bit konvertieren, also rekursiv einfach über das Ergebnis schleifen und unicode in str konvertieren. Es ist jedoch wahrscheinlich am besten, die Strings als Unicode zu belassen.

8

Unicode ist hier ein geeigneter Typ. Die JSONDecoder docs beschreibt die Umwandlungstabelle und Zustand, dass json String-Objekte in Unicode decodiert werden Objekte

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 

„Codierung der Codierung bestimmt verwendet, um alle str Objekte von dieser Instanz (UTF-8 dekodiert zu interpretieren, indem Standard)."

28

Ich glaube, dass die d3 Druck unten ist, die Sie gesucht haben (was die Kombination von Deponien und Lasten) :)

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

Huh? 'json.dumps' konvertiert das dict zurück in eine (JSON-codierte) Zeichenkette. Das wollte das OP nicht tun. -1. –

+4

Aber wenn Sie es zusammen mit json.loads verwenden, gibt es das Wörterbuch ohne die codierten Zeichen aus, das eine Antwort auf die Frage ist (das ist d3, drucken Sie oben), lesen Sie die Antwort gut! – Mercury

Verwandte Themen