Сравнение JSON
JSONСравнивает два документа JSON и подсвечивает структурные отличия.
На этой странице
Что такое сравнение JSON?#
Сравнение JSON (diff) берёт два документа JSON и точно сообщает, что между ними изменилось — какие поля появились, какие исчезли, а какие остались на том же пути, но приняли другое значение. Это структурный аналог текстового diff, но вместо совпадения строк он обходит дерево объектов и массивов, поэтому переход значения с 1 на 2 виден как точечное изменение по конкретному пути, а не как переписанный блок текста.
Это важно всегда, когда JSON — проводной формат чего-то, что эволюционирует: ответы API между развёртываниями, конфиги между ревизиями, фикстуры в тестовом наборе, экспортируемые данные за разные дни. Смотреть на два красиво напечатанных блока бок о бок работает лишь для крошечных документов; как только вложенность становится глубокой, отличия нужно перечислить.
Подвох в том, что сравнение JSON чувствительно к порядку массивов. Два массива равны, только если их элементы совпадают позиция за позицией, потому что именно так сам JSON определяет равенство. Поэтому [a, b] и [b, a] различны, и diff сообщит об этом — полезно, когда порядок значим (последовательность шагов), и неожиданно, когда нет (множество, замаскированное под массив).
Как пользоваться#
- Вставьте исходный документ в панель Слева (оригинал), а изменённый — в панель Справа (изменено).
- Сравнение выполняется в реальном времени по мере ввода. Можно также нажать Сравнить, чтобы принудительно обновить.
- Область вывода отображает каждую разницу отдельной строкой:
- Добавлено — путь существует только справа; строка показывает новое значение.
- Удалено — путь существует только слева; строка показывает старое значение.
- Изменено — путь есть с обеих сторон, но со значением, которое отличается; строка показывает
старое → новое. Каждая строка помечена путём в стиле JSONPath, например$.versionили$.tags[2], чтобы его можно было найти в любом из документов.
- Если оба документа полностью равны, строка состояния явно сообщает об этом — «различий нет» — вместо пустой панели, которую надо интерпретировать.
- Пример загружает реалистичную пару «до/после»; Очистить сбрасывает обе панели и результат.
Ключевые возможности#
- Структурное, а не текстовое. Сравнивается разобранное дерево значений, поэтому переформатирование отступов, переупорядочивание ключей объекта или изменение пробелов никогда не дают ложного отличия.
- Точные пути. Каждое изменение несёт своё расположение в нотации JSONPath —
$для корня,.keyдля полей объекта,[i]для индексов массива — поэтому можно сразу перейти в нужное место. - Три типа изменений. Добавлено, удалено и изменено сообщаются раздельно и с цветовой маркировкой, поэтому добавления визуально отличаются от удалений и правок.
- Отдельная отчётность об ошибках по каждой стороне. Если один из вводов не является корректным JSON, строка состояния назовёт, какая сторона не прошла проверку («Левый ввод не является корректным JSON»), а не упадёт непонятно.
- Живое сравнение. Diff обновляется по мере редактирования любой панели, поэтому работа с фикстурой или ответом идёт немедленно.
Разбор примера#
Загрузите Пример, и обе панели заполнятся небольшим конфигом до и после правки:
{
"name": "ArpGate",
"version": 1,
"tags": ["json", "encoding"],
"features": { "static": true, "backend": null }
}
слева, против:
{
"name": "ArpGate",
"version": 2,
"tags": ["json", "encoding", "crypto"],
"features": { "static": true, "backend": false, "offline": true }
}
справа. Diff точно перечисляет, что сдвинулось:
changed $.version 1 → 2
added $.tags[2] "crypto"
changed $.features.backend null → false
added $.features.offline true
Заметьте, чего нет: $.name (без изменений), $.tags[0] и $.tags[1] (без изменений) и $.features.static (без изменений). Равные ветви не дают вывода, поэтому четыре строки diff — полная картина, хотя в обоих документах по несколько полей. Если затем задать в обеих панелях один и тот же документ, строка состояния переключится на «различий нет — вводы идентичны».
FAQ#
Почему переупорядоченный массив отображается как полностью изменённый?#
JSON-массивы упорядочены, а равенство — позиционное. [1, 2] и [2, 1] различаются по индексу 0 и индексу 1, поэтому diff сообщает о двух изменениях. Это верно для последовательностей, где порядок значим. Если ваш массив представляет множество, отсортируйте его (или нормализуйте) в обоих документах перед сравнением — иначе перестановки будут выглядеть как правки.
Замечает ли инструмент переименование ключа объекта?#
Он сообщает это как удаление плюс добавление, потому что JSON не умеет выражать «этот ключ стал тем». Переименование enabled в active отображается как removed $.enabled и added $.active — две строки, а не одно «переименование». Это честное представление того, что изменилось в данных.
Как выглядит изменение типа?#
Оно сообщается одной строкой changed. Если значение переходит со строки "36" в число 36, diff показывает "36" → 36 по этому пути — различающиеся сериализации делают смену типа видимой. То же касается null, превращающегося в false, или числа, превращающегося в объект.
Может ли инструмент сказать, какие поля не изменились?#
Нет, и намеренно. Перечисление каждого неизменного поля утопило бы реальные изменения в шуме любого настоящего документа. Diff показывает только дельты; равные ветви молчат. Если нужно увидеть полную структуру одного документа, отрендерите его просмотрщиком дерева.