#Что произошло и когда проявляется ошибка
В Python json.dumps и json.dump по умолчанию записывают кириллицу как \uXXXX: это корректный JSON, а не порча символов. Для читаемого русского текста используйте ensure_ascii=False и UTF-8.
#Причины и диагностические признаки
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| По умолчанию ensure_ascii=TrueСтандартный сериализатор экранирует не-ASCII символы. | В JSON вместо русских букв видно \u041f... | Передать ensure_ascii=False. |
| Файл сохраняется не в UTF-8Параметр ensure_ascii не управляет кодировкой файла. | После изменений появляются «кракозябры» при открытии | Задать encoding=UTF-8 при записи и чтении. |
| Просмотрщик показывает буквальные escapeJSON-представление и распознанное значение различаются. | Один редактор показывает \uXXXX, другой — русский текст | Проверить декодирование через json.load. |
#Подробная пошаговая диагностика и исправление
- 1. Проверьте, действительно ли повреждены данныеВ новом тестовом файле запишите пример и выполните его. Первый вывод содержит последовательности
\uXXXX, второй — обычную кириллицу; оба варианта приjson.loadsвозвращают одну и ту же строку. - Пример кода по темеPythonОбразец кода для файла .py в тестовой копии проекта; перед внедрением замените имена файлов на реальные.
import json data = {"text": "Привет"} print(json.dumps(data)) print(json.dumps(data, ensure_ascii=False)) assert json.loads(json.dumps(data))["text"] == "Привет"
- 2. Включите читаемую запись JSONВ исходном коде найдите
json.dumpилиjson.dumps. Добавьтеensure_ascii=False; для файла откройте его сencoding="utf-8". Сначала пишите в новое имя, чтобы не перезаписать рабочий файл. - Режим x не перезаписывает файл с тем же именемPythonРежим x не перезаписывает файл с тем же именем.
import json obj = {"message": "Русский текст"} with open("new-output.json", "x", encoding="utf-8") as f: json.dump(obj, f, ensure_ascii=False, indent=2) f.write("\n")
- 3. Прочитайте файл той же кодировкойОткройте
new-output.jsonв редакторе UTF-8 и убедитесь, что русские символы отображаются как текст. Затем считайте его черезjson.loadи сравните значения. - Пример кода по темеPythonОбразец кода для файла .py в тестовой копии проекта; перед внедрением замените имена файлов на реальные.
import json with open("new-output.json", encoding="utf-8") as f: result = json.load(f) assert result["message"] == "Русский текст"
- 4. Проверьте ограничения получателяНекоторые внешние системы требуют определённого способа экранирования или ASCII-совместимости; в этом случае
\uXXXXоставлять допустимо. В JSON обратный слеш в строке должен быть корректно экранирован, а управляющие символы будут экранироваться даже приensure_ascii=False.
- 5. Проверьте повторную обработку на реальных данныхСоздайте файл с несколькими русскими словами и символами, прочитайте его повторно и сравните с исходным словарём. Если значения не совпали, ищите причину в кодировке исходного текста или преобразованиях до
json.dump, а не в самом\uXXXX.
#Как проверить, что проблема устранена
Файл в UTF-8 открывается с обычной кириллицей и без потерь восстанавливается через json.load; вариант с escape также корректно читается.
#Если исправление не помогло
Не нужно заменять \u текстовой подстановкой: этим легко испортить реальные обратные слеши и экранированные управляющие символы.