Сравнение JSON

Вставьте две версии JSON — например, ответы API до и после изменения или две версии конфигурации — и посмотрите, что добавилось, удалилось и изменилось. Каждое различие показано с путём к значению, поэтому его легко найти даже в большом документе.

Как пользоваться

Вставьте исходный JSON в поле «Было», изменённый — в поле «Стало» или откройте файлы кнопками в шапках полей. Результат обновляется сам во время ввода. Кнопка с двумя стрелками меняет стороны местами, кнопка примера подставляет образец. При синтаксической ошибке появится сообщение с номером строки, а место ошибки подчёркивается в соответствующем поле.

Код обрабатывается в браузере, не отправляется на сервер и не сохраняется после закрытия страницы. Размер каждой стороны — до 2 МБ в UTF-8. Отчёт о различиях можно скопировать или скачать текстовым файлом. Большой отчёт на странице сокращается, но копирование и скачивание сохраняют все различия и значения целиком.

Длительную обработку можно остановить кнопкой «Отменить обработку». Изменение ввода прерывает предыдущий расчёт; для повторного запуска измените данные или нажмите кнопку примера. Если документ слишком сложен, появится сообщение с предложением разделить его на части.

Для вашего удобства рекомендую использовать полноэкранный режим.

Сравниваем…

Было

Файл не выбран
UTF-8, до 2 МБ. Файл можно перетащить на поле. Файл обрабатывается только в вашем браузере.
{
  "name": "basicweb",
  "version": 1,
  "id": 9007199254740993,
  "tags": ["html", "css"],
  "author": { "city": "Москва" }
}

Стало

Файл не выбран
UTF-8, до 2 МБ. Файл можно перетащить на поле. Файл обрабатывается только в вашем браузере.
{
  "version": 2,
  "name": "basicweb",
  "id": 9007199254740992,
  "tags": ["html", "css", "js"],
  "author": { "city": "Казань", "site": "basicweb.ru" }
}

Различия

Для сравнения включите JavaScript. Пример: в {"a": 1, "b": 2} и {"b": 3, "a": 1} различается только b — порядок ключей не важен.

Как читать результат

Каждая строка отчёта начинается со знака, поэтому вид изменения понятен и без цвета: + — значение добавлено, − — удалено, ~ — изменено, после стрелки указано новое значение. Путь записан как в JavaScript: author.city — свойство city объекта author, tags[2] — третий элемент массива tags. Ключи с пробелами и точками записываются в кавычках: ["first name"].

Код
~ version: 1 → 2
~ id: 9007199254740993 → 9007199254740992
+ tags[2]: "js"
~ author.city: "Москва" → "Казань"
+ author.site: "basicweb.ru"

Что считается различием

Порядок ключей в объекте не важен: {"a": 1, "b": 2} и {"b": 2, "a": 1} совпадают. Порядок элементов массива важен, поэтому массивы сравниваются по позициям: вставка элемента в начало сдвигает все следующие. Пробелы, переносы и отступы на результат не влияют — сравнивается содержание, а не запись.

Числа сравниваются по значению без потери точности: 1.0 и 1 равны, а 9007199254740993 и 9007199254740992 различаются, хотя обычный JSON.parse() в JavaScript округлил бы их до одного числа. Если ключ в объекте повторяется, учитывается последнее значение — так же поступает JSON.parse(). Смена типа, например строки "1" на число 1, считается изменением.

Вопросы и ответы

Безопасно ли сравнивать рабочие данные?

Да. Сравнение выполняется в вашем браузере, данные не отправляются на сервер и не сохраняются после закрытия вкладки.

Почему переставленные ключи не считаются различием?

В JSON объект — это набор пар «ключ — значение» без порядка, и большинство программ читают его одинаково при любой последовательности ключей. Поэтому отчёт показывает только изменения содержания.

Можно ли сравнить JSON с ошибкой?

Нет: сначала нужно исправить синтаксис. Сообщение укажет сторону, строку и столбец, а место ошибки будет подчёркнуто. Привести JSON к читаемому виду поможет JSON форматтер.

Изучить JSON

Синтаксис и работа с JSON в JavaScript описаны в статьях об объекте JSON, методах JSON.parse() и JSON.stringify().