2012-12-18 14 views
89

Riceverò un modulo stringa codificato JSON Obj-C e sto decodificando una stringa fittizia (per ora) come il seguente codice. La mia uscita esce con carattere 'u' prefisso ogni voce:Python: json.loads restituisce gli elementi con prefisso 'u'

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

Come è JSON L'aggiunta di questo unicode char? Qual è il modo migliore per rimuoverlo?

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 ha un pr oblem qui. Tutto non è freddo. Ricevo errori nelle stringhe create da Python quando provo a scrivere queste stringhe su un file. Ad esempio quando python prende "53" da JSON lo trasforma in u'53 'e tenta di scriverlo su un file come carattere esadecimale u' \ xe1 'che fa sì che Python prenda una stringa perfettamente buona e vomiti su di esso: JSON: { "sa_BstDeAv": "53", "sa_BwVUpMx" ... PITONE: {u'sa_BstDeAv ': u'53', u'sa_BwVUpMx' ... ERRORE SU SCRITTURA: Errore di valore (il codec 'ascii' non può codificare il carattere u '\ xe1' nella posizione 5: ordinale non nel range (128)) –

+0

@janehouse la risposta giusta qui è la risposta di jdi pensa che dovresti cambiarlo. – Dekel

risposta

109

Il prefisso u indica semplicemente che si dispone di una stringa Unicode. Quando usi veramente la stringa, non apparirà nei tuoi dati. Non essere gettato dalla stampa.

Per esempio, provate questo:

print mail_accounts[0]["i"] 

Non vedrete una u.

+2

La tua risposta è stata la più utile che ho ricevuto, e penso che il richiedente di questa domanda l'avrebbe davvero apprezzato: http://stackoverflow.com/questions/956867/how-to-get-string-objects-instead-of -unicode-ones-from-json-in-python – jimh

+1

Grazie mille! Sono stato confuso per la tua lettera per così tanto tempo –

105

Tutto è bello, amico. La 'u' è una buona cosa, indica che la stringa è di tipo Unicode in python 2.x.

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

+53

Mi piace il tono molto freddo di questo. +1 per una risposta (corretta) che mi ha fatto sorridere. – mgilson

+10

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

+14

Questa è stata la risposta più rilassante che ho letto su StackOverflow. – aanrv

3

Il u prefisso significa che quelle stringhe Unicode piuttosto che stringhe a 8 bit. Il modo migliore per non mostrare il prefisso u è passare a Python 3, dove le stringhe sono unicode per impostazione predefinita. Se questa non è un'opzione, il costruttore str convertirà da unicode a 8 bit, quindi semplicemente ricorsivamente ricorsivamente sul risultato e convertire unicode in str. Tuttavia, probabilmente è meglio lasciare le stringhe come unicode.

8

Unicode è un tipo appropriato qui. La documentazione JSONDecoder descrivono la tabella di conversione e precisa che oggetti stringa json vengono decodificati in Unicode oggetti

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 

"encoding determina la codifica utilizzata per interpretare oggetti str decodificate da questa istanza (UTF-8 da predefinito)."

28

credo che la stampa d3 sotto è quello che stavate cercando (che è la combinazione delle discariche e dei carichi) :)

Avere:

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 

Prints:

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

Eh? 'json.dumps' converte il dict in una stringa (codificata JSON). Questo non è ciò che l'OP voleva fare. -1. –

+4

Ma se lo si utilizza insieme a json.loads, esso emette il dizionario senza i caratteri codificati. Wihch è una risposta per la domanda (questa è la stampa d3 sopra) leggi bene la risposta! – Mercury

Problemi correlati