Json.dump: примеры (PYTHON)

Работа с json.dump: сериализация данных в файлы на Python
Раздел: JSON, Сериализация
json.dump(obj, fp, skipkeys, ensure_ascii, check_circular, allow_nan, cls, indent, separators, default, sort_keys): None

Функция json.dump в Python

Функция json.dump() из модуля json предназначена для сериализации объектов Python в JSON-форматированный поток, записываемый в файловый объект. Она используется для сохранения структур данных в файлы или передачи данных по сетевому соединению.

Основные аргументы функции:

  • obj - объект Python, предназначенный для сериализации.
  • fp - файловый объект, в который производится запись. Объект должен поддерживать метод .write().
  • skipkeys - если True, пропускает ключи словаря, не являющиеся базовыми типами (str, int, float, bool, None). По умолчанию False.
  • ensure_ascii - если True, экранирует все не-ASCII символы. При False записывает символы как есть. По умолчанию True.
  • check_circular - проверка на циклические ссылки. По умолчанию True.
  • allow_nan - разрешение на сериализацию значений NaN, Infinity, -Infinity. По умолчанию True.
  • indent - определяет отступы для вложенных структур. Может быть целым числом или строкой.
  • separators - кортеж из двух строк, разделяющих элементы и ключи со значениями. По умолчанию (', ', ': ').
  • default - функция, вызываемая для объектов, не поддерживающих сериализацию по умолчанию.
  • sort_keys - если True, ключи словаря выводятся в отсортированном порядке. По умолчанию False.

Функция не возвращает значения.

Примеры применения json.dump

Стандартная запись в файл:

import json

data = {"name": "Иван", "age": 30, "city": "Москва"}
with open("data.json", "w", encoding="utf-8") as f:
    json.dump(data, f)

Результат в файле data.json:

{"name": "\u0418\u0432\u0430\u043d", "age": 30, "city": "\u041c\u043e\u0441\u043a\u0432\u0430"}

Запись с отступами и отключением экранирования ASCII:

import json

data = {"name": "Иван", "age": 30}
with open("data.json", "w", encoding="utf-8") as f:
    json.dump(data, f, ensure_ascii=False, indent=4)
{
    "name": "Иван",
    "age": 30
}

Сортировка ключей и использование пользовательских разделителей:

import json

data = {"z": 1, "a": 2, "m": 3}
with open("data.json", "w") as f:
    json.dump(data, f, sort_keys=True, separators=(",", ":"))
{"a":2,"m":3,"z":1}

Похожие функции в Python

json.dumps() выполняет ту же сериализацию, но возвращает строку JSON вместо записи в файл. Используется, когда результат нужен в виде строки.

pickle.dump() из модуля pickle сериализует объекты Python в бинарный формат. Поддерживает больше типов данных, но специфичен для Python и потенциально небезопасен.

Выбор зависит от задачи: json.dump применяется для обмена данными с другими системами, json.dumps - для получения строки, pickle - для временного хранения объектов Python.

Аналоги в других языках программирования

JavaScript: JSON.stringify() преобразует объект в строку JSON. Запись в файл требует API окружения (например, Node.js).

const data = { name: "Иван", age: 30 };
const jsonString = JSON.stringify(data);
console.log(jsonString);
{"name":"Иван","age":30}

PHP: json_encode() возвращает строку JSON. Для записи в файл используется file_put_contents().

$data = ["name" => "Иван", "age" => 30];
$jsonString = json_encode($data);
file_put_contents("data.json", $jsonString);

Java: используются библиотеки вроде Jackson или Gson. Пример с Jackson:

ObjectMapper mapper = new ObjectMapper();
Map data = new HashMap<>();
data.put("name", "Иван");
data.put("age", 30);
mapper.writeValue(new File("data.json"), data);

Основное отличие - в Python json.dump объединяет сериализацию и запись в файл, в то время как во многих других языках это два отдельных шага.

Частые ошибки при работе с json.dump

Попытка сериализации неподдерживаемого типа данных:

import json

with open("data.json", "w") as f:
    json.dump({1, 2, 3}, f)  # set не поддерживается
TypeError: Object of type set is not JSON serializable

Использование файлового объекта, открытого не на запись:

import json

with open("data.json", "r") as f:
    json.dump({"test": 1}, f)
io.UnsupportedOperation: not writable

Циклические ссылки при отключенной проверке:

import json

a = {}
b = {}
a["ref"] = b
b["ref"] = a
with open("data.json", "w") as f:
    json.dump(a, f, check_circular=False)
RecursionError: maximum recursion depth exceeded

Изменения в новых версиях Python

В Python 3.9 добавлен параметр default для функции json.dump, позволяющий указывать функцию для сериализации неподдерживаемых типов.

В Python 3.11 улучшена производительность модуля json за счет оптимизации кода.

Начиная с Python 3.6, параметр indent может принимать строку для использования в качестве отступа.

Расширенные примеры использования

Сериализация пользовательского класса с помощью параметра default:

Пример python
import json

class User:
    def __init__(self, name, age):
        self.name = name
        self.age = age

def user_encoder(obj):
    if isinstance(obj, User):
        return {"name": obj.name, "age": obj.age}
    raise TypeError(f"Object of type {obj.__class__.__name__} is not JSON serializable")

user = User("Анна", 25)
with open("user.json", "w", encoding="utf-8") as f:
    json.dump(user, f, default=user_encoder, ensure_ascii=False, indent=2)
{
  "name": "Анна",
  "age": 25
}

Запись нескольких JSON-объектов в один файл:

Пример python
import json

items = [
    {"id": 1, "name": "Товар 1"},
    {"id": 2, "name": "Товар 2"}
]
with open("items.json", "w") as f:
    for item in items:
        json.dump(item, f)
        f.write("\n")  # Разделитель - новая строка
{"id": 1, "name": "\u0422\u043e\u0432\u0430\u0440 1"}
{"id": 2, "name": "\u0422\u043e\u0432\u0430\u0440 2"}

Использование строки в качестве отступа:

Пример python
import json

data = {"a": 1, "b": 2}
with open("data.json", "w") as f:
    json.dump(data, f, indent="--", separators=(",", ":"))
{
--"a":1,
--"b":2
}

питон json.dump function comments

En
Json.dump Serialize object to JSON file