Перейти к основному содержимому

JSON Patch

JSON Patch — формат для описания изменений в JSON-документе. Вместо отправки документа для обновления, отправляется набор операций («патч»), которые нужно применить.

Экономит трафик, делает изменения предсказуемыми и атомарными.

Описан в стандарте RFC 6902

Примеры применения

  • в RESTful API для частичного обновления ресурсов (PATCH-запросы),
  • для синхронизации состояния между клиентами
  • где важно версионирование
  • в event-sourcing как событие

Пример

Исходно:

{ "user": "Иван", "age": 30 }

Патч (набор операций):

[
{ "op": "replace", "path": "/age", "value": 31 },
{ "op": "add", "path": "/city", "value": "Москва" }
]

Результат:

{ "user": "Иван", "age": 31, "city": "Москва" }

Особенности

Строгий формат операций

Операция (op)Обязательные поляОписание
addpath, valueДобавляет значение по указанному пути. Если путь указывает на существующий ключ объекта — перезаписывает его. Если на индекс массива — вставляет элемент, сдвигая существующие вправо. Использование /- добавляет в конец массива.
removepathУдаляет значение по указанному пути. Для массива удаляет элемент, сдвигая остальные влево.
replacepath, valueКороткий синтаксис для remove + add по тому же пути. Полностью заменяет значение по указанному пути на новое. Путь должен существовать.
movefrom, pathПеремещает значение из пути from в путь path. Эквивалентно операции remove по from, а затем add по path с тем же значением, но выполняется атомарно.
copyfrom, pathКопирует значение из пути from в путь path. Исходное значение остается на месте. Эквивалентно операции add по path со значением, взятым из from.
testpath, valueПроверяет, что значение по указанному path в текущем документе совпадает с предоставленным value. Если не совпадает — патч не применяется (вся транзакция откатывается).

Расширять этот набор другими операциями нельзя, если нужно сохранить совместимость с системами, реализующими RFC 6902.

Применяется атомарно

Если любая операция в массиве завершается ошибкой (например, путь не найден для remove, или операция test возвращает false), весь патч должен быть откачен, и документ остается без изменений. Это гарантирует целостность.

Операции применяются последовательно

Последующие могут зависеть от результата предыдущих. Пример: чтобы переместить (move) данные из /a в /b, сначала убедиться, что /b не существует, или удалить его в предыдущей операции.

Важно: для безопасности нужно валидировать входящие патчи (особенно пути), чтобы избежать инъекций или изменения системных данных.

JSON Patch vs JSON Merge Patch

JSON Merge Patch (RFC 7396)

Простой формат для слияния (merge) JSON-документов. Отправляется фрагмент, который нужно "наложить" на целевой документ:

  • значения заменяются
  • null означает "удалить поле"
  • отправляются только изменяемые поля

Пример:

// Исходный: {"a": "b", "c": {"d": "e"}}
// Патч: {"a": "z", "c": {"f": "g"}, "h": null}
// Результат: {"a": "z", "c": {"d": "e", "f": "g"}}
// (h удалён, d остался)

Отличия от JSON Patch

  1. Работа с массивами Merge Patch не может частично изменить массив — только полностью заменить. JSON Patch позволяет точечные операции (add/remove по индексу).

  2. Семантика null
    У Merge Patch null = удаление поля. У JSON Patch null = обычное значение, а удаление — операция remove.

  3. Безопасность и атомарность
    Merge Patch — простое слияние без гарантий. JSON Patch — транзакционный формат с атомарностью, проверкой (test) и чёткой спецификацией операций.

Когда использовать:

  • Merge Patch — для простых обновлений объектов (конфиги, настройки пользователя).
  • JSON Patch — когда нужна точность: работа с массивами, контроль целостности, синхронизация.

Материалы

  1. Оптимизация трафика при синхронизации состояний через Jsonpatch
  2. Убегайте от праздника «пустых» проверок: правильно выполняйте PATCH с помощью JSON Patch
  3. Знакомство с патчем слияния JSON: обзорная серия JSON-P 1.1
  4. What is JSON Patch?

Видео

1.JSON Patch vs JSON Merge Patch