Python WindowsLinuxmacOSPython 3

Python: При записи JSON появляются escape-последовательности кириллицы

  • Обновлено
  • Чтение ≈ 2 минуты

Краткий ответ

В Python json.dumps и json.dump по умолчанию записывают кириллицу как \uXXXX: это корректный JSON, а не порча символов. Для читаемого русского текста используйте ensure_ascii=False и UTF-8.

В этой статье
  1. Что произошло и когда проявляется ошибка
  2. Причины и диагностические признаки
  3. Подробная пошаговая диагностика и исправление
  4. Как проверить, что проблема устранена
  5. Если исправление не помогло

#Что произошло и когда проявляется ошибка

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

#Как проверить, что проблема устранена

Файл в UTF-8 открывается с обычной кириллицей и без потерь восстанавливается через json.load; вариант с escape также корректно читается.

#Если исправление не помогло

Не нужно заменять \u текстовой подстановкой: этим легко испортить реальные обратные слеши и экранированные управляющие символы.

Источники и обновления

Последнее обновление статьи: 2 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.