Utilisez le ensure_ascii=Falsecommutateur à json.dumps(), puis encodez la valeur en UTF-8 manuellement:
>>> 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())
"ברי צקלה"
Si vous écrivez dans un fichier, utilisez-le json.dump()et laissez-le à l'objet fichier à encoder:
with open('filename', 'w', encoding='utf8') as json_file:
json.dump("ברי צקלה", json_file, ensure_ascii=False)
Avertissements pour Python 2
Pour Python 2, il y a d'autres mises en garde à prendre en compte. Si vous écrivez ceci dans un fichier, vous pouvez utiliser io.open()au lieu de open()pour produire un objet fichier qui code pour vous les valeurs Unicode pendant que vous écrivez, puis utilisez json.dump()plutôt pour écrire dans ce fichier:
with io.open('filename', 'w', encoding='utf8') as json_file:
json.dump(u"ברי צקלה", json_file, ensure_ascii=False)
Notez qu'il y a un bogue dans le jsonmodule où le ensure_ascii=Falsedrapeau peut produire un mélange d' objets unicodeet str. La solution de contournement pour Python 2 est alors:
with io.open('filename', 'w', encoding='utf8') as json_file:
data = json.dumps(u"ברי צקלה", ensure_ascii=False)
# unicode(data) auto-decodes data to unicode if str
json_file.write(unicode(data))
En Python 2, lorsque vous utilisez des chaînes d'octets (type str), codées en UTF-8, assurez-vous de définir également le encodingmot - clé:
>>> 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']
ברי צקלה