2013-02-13 5 views
12

voglio ottenere i dati JSON in UTF-8pitone dizionario jsonify in UTF-8

Ho una lista my_list = []

e allora molti aggiunge i valori Unicode alla lista come questa

my_list.append(u'ტესტ') 

return jsonify(result=my_list) 

e diventa

{ 
"result": [ 
"\u10e2\u10d4\u10e1\u10e2", 
"\u10e2\u10dd\u10db\u10d0\u10e8\u10d5\u10d8\u10da\u10d8" 
] 
} 
+0

Questo è corretto. I tuoi dati sono stati codificati in JSON, con i codepoint unicode codificati in punti di escape '\ uabcd'. Qual è il problema esattamente? Poiché la codifica per i caratteri barra rovesciata, i caratteri 'u', ecc. Sono uguali in UTF8 e in ASCII, può sembrare confuso ma * è * legale JSON, * e * UTF8. –

+0

Ho anche modificato la tua domanda; hai un 'elenco', non un' dict'. –

+0

Voglio ottenere json come gli stessi valori in utf-8 senza codepoint unicode – beka

risposta

9

Utilizzare la json module invece, e impostare t-standard library egli ensure_ascii parametro parola chiave per la codifica False quando, o fare lo stesso con flask.json.dumps():

>>> data = u'\u10e2\u10d4\u10e1\u10e2' 
>>> import json 
>>> json.dumps(data) 
'"\\u10e2\\u10d4\\u10e1\\u10e2"' 
>>> json.dumps(data, ensure_ascii=False) 
u'"\u10e2\u10d4\u10e1\u10e2"' 
>>> print json.dumps(data, ensure_ascii=False) 
"ტესტ" 
>>> json.dumps(data, ensure_ascii=False).encode('utf8') 
'"\xe1\x83\xa2\xe1\x83\x94\xe1\x83\xa1\xe1\x83\xa2"' 

Si noti che è ancora necessario per codificare in modo esplicito il risultato UTF8 perché la funzione dumps() restituisce un oggetto unicode in quel caso.

È possibile impostarlo come predefinito (e utilizzare nuovamente jsonify()) da setting JSON_AS_ASCII to False nella configurazione dell'app Flask.

ATTENZIONE: non includono i dati non attendibili in JSON che non è ASCII-safe, e poi interpolare in un template HTML o utilizzare in un API JSONP, come si può causare errori di sintassi o aprire una vulnerabilità cross-site scripting per di qua. Questo perché JSON is not a strict subset of Javascript e quando si disabilita la codifica ASCII-safe i separatori U + 2028 e U + 2029 non verranno sfuggiti alle sequenze \u2028 e \u2029.

+0

l'output è completamente diverso in py3.5 – Blauhirn

+0

@Blauhirn: Questo perché ci sono differenze di materiale tra Python 2 e Python 3. L'OP qui sta usando Python 2 (evidente dai prefissi di stringa 'u'). –

+0

@Blauhirn: in Python 2, gli oggetti stringa con caratteri non ASCII vengono richiamati con * escapes *, per garantire che il valore rimanga sicuro ASCII. In Python 3 le regole sono state rilassate e ora i caratteri stampabili Unicode vengono lasciati come valori letterali. Quindi vedrai ''" "ტესტ"' anche senza usare 'print()'. Usa 'stampa (ascii (....)) 'se vuoi vedere lo stile Python 2. –

18

utilizzare la seguente configurazione per aggiungere supporto UTF-8:

app.config['JSON_AS_ASCII'] = False 
+0

Mi hai salvato per cambiare la mia funzione jsonify con json.dumps(). grazie ... – oyilmaztekin

+0

Sì, la soluzione migliore se vuoi anche conservare il rientro che aggiunge jsonify, ma json.dumps no. – QtRoS

+1

Questa è la risposta giusta –

1

Se si vuole ancora di JSON di pallone utenti e garantire la codifica UTF-8, allora si può fare qualcosa di simile:

from flask import json,Response 
@app.route("/") 
def hello(): 
    my_list = [] 
    my_list.append(u'ტესტ') 
    data = { "result" : my_list} 
    json_string = json.dumps(data,ensure_ascii = False) 
    #creating a Response object to set the content type and the encoding 
    response = Response(json_response,content_type="application/json; charset=utf-8") 
    return response 

Spero che questo aiuti

0

Nel mio caso la soluzione di cui sopra non era sufficiente. (Esecuzione di una bottiglia sull'ambiente flessibile di GCP App Engine). Ho finito per fare:

json_str = json.dumps(myDict, ensure_ascii = False, indent=4, sort_keys=True) 
encoding = chardet.detect(json_str)['encoding'] 
json_unicode = json_str.decode(encoding) 
json_utf8 = json_unicode.encode('utf-8') 
response = make_response(json_utf8) 
response.headers['Content-Type'] = 'application/json; charset=utf-8' 
response.headers['mimetype'] = 'application/json' 
response.status_code = status