Вопрос или проблема
После того как мне понадобился инструмент сравнения для XML-файлов, теперь я ищу инструмент для сравнения данных JSON.
Те же требования:
- Бесплатно
- На основе дерева, а не строк; т.е. если раздел перемещен в другое место на том же уровне/в той же ветке дерева, не должно сообщаться о различиях.
- Порядок в массивах JSON также не имеет значения; обмененные местами элементы должны считаться ‘без разницы’.
- Все различия должны быть отмечены, предпочтительно в виде отображения “бок о бок” с индикаторами или линиями, соединяющими различающиеся разделы
- Онлайн-версия подходит
Эти два файла должны считаться ‘одинаковыми’:
{
"errormessage": "",
"success": 1,
"items": [
{
"id": 20100,
"name": "AA3 met extra tekst2"
},{
"name": "Indirecte uren\\Ziekte",
"id": 34
}],
"type": "ttgetlistresult"
}
и
{
"errormessage": "",
"items": [
{
"id": 34,
"name": "Indirecte uren\\Ziekte"
},{
"id": 20100,
"name": "AA3 met extra tekst2"
}],
"success": 1,
"type": "ttgetlistresult"
}
Мой open source онлайн-инструмент для сравнения json должен быть полезен: https://json-diff.com
Я недавно нашел json-delta на https://pypi.python.org/pypi/json-delta/
Вы можете установить его на своем компьютере командой
pip install json-delta
Чтобы использовать его, просто используйте команду
json_diff -u file1.json file2.json
При поиске ответа на этот вопрос, кроме варианта использования SemanticMerge в качестве моего предложенного ответа для “инструмента сравнения XML-файлов”, я нашел другой инструмент, который утверждает, что осведомлен о контексте для нескольких языков программирования: Compare++, который гордится следующим:
По сравнению с другими инструментами сравнения файлов, большое достижение в Compare++ заключается в использовании языково-ориентированного структурированного механизма сравнения с двумя режимами сравнения (“Код-ориентированный” и “Текст-ориентированный”) для сравнения исходных файлов. Полностью понимая структуру кода, вы можете получить более точные результаты сравнения кода и богатые функции после сравнения.
…
Для помощи в просмотре изменений структуры кода предоставляется закрепляемая панель “Function View”, в которой перечислены все структуры, такие как функции, классы или пространства имен (измененные, удаленные или добавленные).…
Языково-ориентированное структурированное сравнение для C/C++, Java, C#, Javascript, CSS и других…
- Compare++ анализирует исходные файлы с встроенным анализом для C/C++, C#, Java, php, html, Javascript, CSS3 и других языков, автоматически извлекая структурированное дерево кода и подчеркивая синтаксис.
- Он может сравнивать не только содержимое файла, но и отображать и сообщать обо всех изменениях функций, классов, пространств имен в виде бок о бок в “Function View”.
- В “Function View” вы можете настроить режим фильтрации для отображения только измененных функций.
Программа не бесплатная (29,95 долларов США/пользователь), но вы можете попробовать ее без лицензии в течение 30 дней.
Я не уверен, действительно ли она предполагает, что код перемещен, или это требует некоторой ручной работы, но она заявляет, что в режиме просмотра функций она может определить, изменена ли она, удалена или добавлена.
PS! На заметку, она также обрабатывает html, так что, возможно, может обработать и xml?
PPS! Вот инструмент на python для сравнения XML, который возможно можно изменить для сравнения json (если конвертировать в etree). Однако, по-видимому, он написан для проверки на равенство и не предоставляет много визуальной обратной связи.
Это может быть полезно:
Это инструментарий командной строки.
Для онлайн-версии, которая также может загружать файлы с диска, смотрите это: https://www.jsondiff.com/
Вы можете использовать онлайн удивительные инструменты, такие как:
JSON Compare
JSON Diff
Просто используйте diff. Например,
diff --unified file1.json file2.json
Ответ или решение
Выбор инструмента для сравнения JSON-файлов
Теория
Сравнение JSON-файлов представляет собой задачу, требующую учета структуры данных, поскольку формат JSON реализует иерархическую структуру. JSON — это текстовый формат обмена данными, который используется для обмена информацией между клиентом и сервером в большинстве современных веб-приложений. Отражение фактических изменений между двумя версиями JSON, особенно если порядок элементов массивов или разделов JSON был изменен, может быть трудной задачей.
Решения для дифференциации данных, которые мы ищем, требуют инструментов, которые сравнивают JSON не как простые текстовые файлы, а с учетом их структуры. Это означает, что если элемент перемещается в пределах одного и того же уровня или если порядок элементов в массивах был изменен, различия не должны быть зарегистрированы, поскольку они не относятся к структурным изменениям данных.
Пример
Рассмотрим два предоставленных JSON-файла. Они содержат одинаковые данные, но порядок элементов изменен:
{
"errormessage": "",
"success": 1,
"items": [
{
"id": 20100,
"name": "AA3 met extra tekst2"
},{
"name": "Indirecte uren\\Ziekte",
"id": 34
}],
"type": "ttgetlistresult"
}
и
{
"errormessage": "",
"items": [
{
"id": 34,
"name": "Indirecte uren\\Ziekte"
},{
"id": 20100,
"name": "AA3 met extra tekst2"
}],
"success": 1,
"type": "ttgetlistresult"
}
Традиционный линейный подход к сравнению файлов вызовет множество ложных срабатываний, заявив, что файлы отличаются. Однако если сравнивать данную структуру с учетом иерархии данных, то эти два файла идентичны.
Практическое применение
-
JsonDiff.com
Это онлайн-инструмент, который предоставляет интерфейс для загрузки и сравнения JSON-файлов. Он предлагает визуальный подход к сравнению JSON, показывая различия структурно, а не линейно. Это бесплатный инструмент, что делает его доступным для широкого использования. -
JsonDelta
Это утилита командной строки Python, обеспечивающая дифференциальное сравнение JSON-файлов. Она также предоставляет возможность сравнения с учетом структуры и имеет командуjson_diff
, которая может использоваться напрямую для сравнения:json_diff -u file1.json file2.json
-
Compare++
Хотя это не бесплатное решение, Compare++ предлагает полнофункциональные средства для сравнения кода, которые могут быть применены и к JavaScript. Его возможности включают синтаксически осознание языка, что делает его полезным для проектов, использующих более сложные языковые структуры. -
GitHub репозитории и NPM-пакеты
Инструменты, такие как JSON-diff, размещенные на GitHub и npm, могут быть необычайно гибкими, позволяя использовать их встроенные возможности для интеграции в существующие системы сборки или тестирования. Они доступны как командные утилиты, что упрощает их включение в CI/CD-процессы. -
JSONDiffOnline
Еще один онлайн-ресурс для сравнения JSON, который предлагает простое drag-and-drop пользовательское взаимодействие. Доступный через браузер, он хорошо подходит для быстрого анализа различий без необходимости установки приложений.
Заключение
Подведение итога использования инструментов для сравнения JSON заключается в понимании требований задач и доступных опций. Бесплатные онлайн-инструменты, такие как JsonDiff.com и JSONCompare, подходят для быстрой проверки различий. Для более детализированного анализа, который требует учета интеграции в рабочие процессы, стоит учитывать JsonDelta и другие командные инструменты. Для глубокого языкозависимого структурного анализа и коммерческих проектов может пригодиться Compare++. Важно помнить, что выбор инструмента должен основываться на адекватности его функций для целей вашего проекта.