Сравнение JSON
Последнее обновление: 2 октября 2026 г.
Сравните два документа JSON и увидьте только реальные различия. Сравнение структурное, поэтому перестановка ключей или переформатирование ничего не меняет; отчёт перечисляет каждое настоящее изменение с его путём, целиком в браузере.
Что видит структурное сравнение
Оба документа сначала разбираются, а затем обходятся вместе. Сообщаются только различия в самих данных: ключ, который есть на одной стороне и отсутствует на другой; изменившееся значение; значение, у которого сменился тип — число стало строкой, объект стал массивом. Пробелы и порядок ключей в сравнении вообще не участвуют, потому что после разбора их уже не существует.
Смена типа сообщается один раз по тому пути, где она произошла, а не разворачивается в удаление и добавление для каждого листового узла под ним. Это сохраняет отчёт читаемым, когда форму меняет целое поддерево.
Почему это не построчный текстовый diff
Текстовый diff — то, что показывает git diff, — сравнивает строки. Для JSON это часто вводит в заблуждение. Переиндентация файла или вывод тех же ключей в другом порядке — обычное дело, когда JSON порождают разные инструменты или версии библиотек, а построчное сравнение превращает это в стену изменений, хотя данные идентичны.
Два документа ниже — один и тот же документ. Построчный diff сообщит о четырёх изменённых строках, а этот инструмент — ни о чём:
{"a": 1, "b": 2}
{
"b": 2,
"a": 1
}
Верно и обратное, и это самое полезное: один изменённый символ в имени ключа или число, изменившееся с 3 на 4, показываются ровно одним изменением, а не тонут в шуме переформатирования.
Как читать запись пути
Каждое изменение сообщается с путём. $ — корень документа, точка ведёт к ключу объекта, а квадратные скобки индексируют массив. Так, $.settings.indent — это ключ indent внутри settings, $.features[2] — третий элемент массива features, а $["weird key"] обозначает ключ, не являющийся простым идентификатором. Запись следует стилю JSON Pointer, поэтому путь из отчёта можно вставить в другие инструменты JSON.
Чего сравнение не скажет
- Массивы сопоставляются по позиции. Вставка элемента в начало длинного массива сдвигает каждый следующий элемент, поэтому каждый отмечается как изменённый, хотя значения лишь сместились. Это честное ограничение любого сравнения без ключа для сопоставления. Если у элементов есть стабильный
id, сначала отсортируйте обе стороны по нему или сравните версию, проиндексированную по нему. - Это не патч. Инструмент сообщает различия, но не выводит документ JSON Patch (RFC 6902) и не обнаруживает перемещённые блоки. Перемещённое значение выглядит как удаление по старому пути и добавление по новому.
- Значения сравниваются точно.
1и1.0для парсера одно и то же число, но1и"1"различны, и отсутствующий ключ отличается от ключа, явно равногоnull.
Частые вопросы
Влияет ли порядок ключей на результат сравнения?
Нет. Оба документа сначала разбираются, и ключи объектов сопоставляются по имени, а не по позиции. Поэтому переформатирование документа или вывод ключей в другом порядке даёт пустой результат — и это правильно, ведь данные те же.
Почему вставка одного элемента в начало массива даёт так много различий?
Массивы сопоставляются по позиции, как почти во всех структурных diff-инструментах. Вставка элемента в начало длинного массива сдвигает каждый следующий элемент на один индекс, поэтому каждый из них отмечается как изменённый, хотя значения лишь сместились. Без ключа для сопоставления невозможно понять, что было вставлено, а что изменено. Если у элементов есть стабильный id, отсортируйте обе стороны по нему перед сравнением.
Что если одна сторона не является допустимым JSON?
Сравнение останавливается, и показывается собственное сообщение парсера для той стороны, где произошла ошибка, с пометкой левая или правая. Пока оба документа не разберутся, их нельзя обойти вместе, поэтому сравнение не выполняется.
Мой JSON куда-нибудь загружается?
Нет. Оба документа разбираются через JSON.parse в браузере и сравниваются в памяти. Ни один запрос их не несёт, учётных записей и серверного хранилища нет. Можно загрузить страницу и затем отключиться от сети — сравнение продолжит работать.
Можно ли определить, что значение переместили, а не изменили?
Нет. Этот инструмент сообщает различия, а не создаёт патч. Он не выводит документ JSON Patch и не обнаруживает значения, перемещённые из одного места в другое; вы увидите удаление по старому пути и добавление по новому.
Можно ли сравнивать JSON с комментариями или висячими запятыми?
Нет. Сравнение использует тот же строгий парсер, что и остальные инструменты сайта, поэтому JSON5, комментарии и висячие запятые отклоняются. Если документ не разбирается, сначала посмотрите место ошибки в форматтере или валидаторе.
Нужно превратить JSON в таблицу? Для этого есть JSON в CSV. Нашли ошибку? Свяжитесь с нами.