Генератор JSON Patch
Сравните два документа JSON и получите патч по RFC 6902, превращающий первый во второй. Всё работает в вашем браузере.
Что делает этот инструмент
Он сравнивает два документа JSON и записывает список операций, превращающих первый во второй, в формате RFC 6902. Вместо того чтобы отправлять целый документ ради одного изменённого поля, вы отправляете само изменение.
Когда пригодится
Чтобы собрать тело запроса PATCH, чтобы записать, что изменилось между двумя версиями файла настроек, или чтобы вести журнал изменений, который куда компактнее, чем хранение всех полных копий. Это ещё и быстрый способ выяснить, чем на самом деле отличаются два документа, выглядящие одинаково.
Какие операции он создаёт
| Операция | Что означает |
|---|---|
| add | Добавляет значение там, где его не было, или вставляет в массив. |
| remove | Удаляет значение в этом месте. |
| replace | Перезаписывает значение там, где оно уже есть. |
| move | Переносит значение из одного места в другое. |
| copy | Копирует значение в другое место. |
| test | Проверяет значение и отменяет весь патч, если оно не совпадает. |
Этот инструмент создаёт только add, remove и replace. Этих трёх хватает, чтобы выразить любое изменение, а патч, который читается строка за строкой, ценнее более короткого, над которым приходится думать. Остальные три входят в RFC 6902, и любой совместимый сервер их принимает.
Как устроены пути
Каждый путь — это JSON Pointer (RFC 6901): маршрут от корня документа, разделённый косыми чертами, где «/address/zipCode» означает поле zipCode внутри address. Позиции в массиве — числа, поэтому «/skills/0» — первый элемент, а дефис означает конец массива: «/skills/-» добавляет в конец. Поскольку косая черта служит разделителем, ключ, содержащий её, записывается как ~1, а буквальная тильда — как ~0.
Замечания о результате
Сравнение буквальное: значения сопоставляются позиция за позицией, поэтому вставка элемента в начало массива даёт replace для всех последующих, а не одну вставку. Для массивов объектов с устойчивыми идентификаторами патч, построенный по идентификаторам, всегда будет короче патча, построенного по позициям.
Как создать JSON Patch
Вставьте два документа JSON и создайте патч.
- Вставьте исходный JSON слева.
- Вставьте изменённый JSON справа.
- Нажмите «Создать» и скопируйте патч.
Частые вопросы
Отправляет ли этот инструмент мои данные куда-либо?
Нет. Оба документа остаются в вашем браузере, а патч создаётся на вашей машине.
Соответствует ли результат RFC 6902?
Да. Каждая операция — объект с op, path и — для add и replace — value, а пути являются JSON Pointer в том виде, в каком их определяет RFC 6901.
Создаёт ли он операции move и copy?
Нет. Он создаёт add, remove и replace, которых достаточно для любого изменения и которые намного легче читать. Операция move — это просто remove, за которым идёт add.
Как применить патч?
Отправьте его в API, принимающий application/json-patch+json, или воспользуйтесь библиотекой: jsonpatch в Python, json-patch в JavaScript, JsonPatchDocument в .NET, json-patch в Java и так далее.
Чем он отличается от JSON Merge Patch?
JSON Merge Patch (RFC 7386) выглядит как сам документ, где null означает «удалить». Это делает его лёгким для чтения, но не позволяет сохранить настоящий null или изменить один элемент массива. JSON Patch многословнее, зато выражает что угодно.
Wikipedia — JSON Patch
Wikipedia — JSON
Wikipedia — Patch (computing)
Wikipedia — Diff
Wikipedia — REST