Verwenden Sie den ensure_ascii=False
Schalter für json.dumps()
und kodieren Sie den Wert dann manuell in UTF-8:
>>> json_string = json.dumps(" ", ensure_ascii=False).encode('utf8')
>>> json_string
b'"\xd7\x91\xd7\xa8\xd7\x99 \xd7\xa6\xd7\xa7\xd7\x9c\xd7\x94"'
>>> print(json_string.decode())
" "
Wenn Sie in eine Datei schreiben, verwenden Sie einfach json.dump()
und überlassen Sie es dem Dateiobjekt, die Kodierung vorzunehmen:
with open('filename', 'w', encoding='utf8') as json_file:
json.dump(" ", json_file, ensure_ascii=False)
Vorsichtsmaßnahmen für Python 2
Für Python 2 gibt es einige zusätzliche Punkte zu beachten. Wenn Sie dies in eine Datei schreiben, können Sie anstelle von open()
io.open()
verwenden, um ein Dateiobjekt zu erstellen, das Unicode-Werte für Sie kodiert, während Sie schreiben. Verwenden Sie dann json.dump()
zum Schreiben in diese Datei:
with io.open('filename', 'w', encoding='utf8') as json_file:
json.dump(u" ", json_file, ensure_ascii=False)
Beachten Sie, dass es einen Fehler im json
Modul gibt, bei dem das Flag ensure_ascii=False
eine Mischung von unicode
und str
Objekten erzeugen kann. Die Workaround-Lösung für Python 2 lautet dann:
with io.open('filename', 'w', encoding='utf8') as json_file:
data = json.dumps(u" ", ensure_ascii=False)
# unicode(data) dekodiert data automatisch in Unicode, wenn es sich um str handelt
json_file.write(unicode(data))
In Python 2, wenn Sie Byte-Strings (Typ str
), codiert in UTF-8, verwenden, stellen Sie sicher, dass Sie auch das Schlüsselwort encoding
setzen:
>>> d={ 1: " ", 2: u" " }
>>> d
{1: '\xd7\x91\xd7\xa8\xd7\x99 \xd7\xa6\xd7\xa7\xd7\x9c\xd7\x94', 2: u'\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4'}
>>> s=json.dumps(d, ensure_ascii=False, encoding='utf8')
>>> s
u'{"1": "\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4", "2": "\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4"}'
>>> json.loads(s)['1']
u'\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4'
>>> json.loads(s)['2']
u'\u05d1\u05e8\u05d9 \u05e6\u05e7\u05dc\u05d4'
>>> print json.loads(s)['1']
>>> print json.loads(s)['2']