Json.dump: примеры (PYTHON)
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:
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-объектов в один файл:
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"}Использование строки в качестве отступа:
import json
data = {"a": 1, "b": 2}
with open("data.json", "w") as f:
json.dump(data, f, indent="--", separators=(",", ":")){
--"a":1,
--"b":2
}