Инструмент Diff для файлов JSON?

После того, как вам понадобился инструмент Diff для 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"
}
Как ответил на другой вопрос, я по-прежнему считаю, что семантическое слияние - ваш лучший выбор. Существует не так много инструментов сравнения, которые заботятся о семантических, а не только о текстовых различиях.
Я нашел как минимум три инструмента (например, этот ), выполнив поиск «json diff» в Google. Вы их уже пробовали?
@ComFreek, я попробовал инструмент, на который вы ссылаетесь, и вставил некоторый код json, который был украшен codebeautify.org/jsonviewer , и он говорит, что json неверен ... :(
@jans ты когда-нибудь находил решение? Если да, не могли бы вы принять ответ или опубликовать свой собственный? Это помогло бы другим
Ни один из ответов не удовлетворяет основному требованию («заменяемые элементы должны рассматриваться как «без разницы»»). Аскер больше не активен. В заголовке не упоминается это особое требование, возможно, поэтому все ответы игнорировали его. Должны ли мы просто удалить это требование?
Мне очень нравится инструмент Meld

Ответы (7)

Мой онлайн-инструмент json diff с открытым исходным кодом должен помочь: http://json-diff.com

http://json-diff.com

Хороший. Есть ли для него настольная версия?
The order in JSON arrays is also irrelevant; swapped elements should be seen as 'no difference'.. Как это сделать? Я вижу, что разница чувствительна к порядку. Есть ли вариант?
Отсортируйте их по чему-нибудь, прежде чем сравнивать...
Это НЕ решает проблему ОП.

При поиске ответа на этот вопрос, помимо варианта использования SemanticMerge в качестве моего предложенного ответа на «Инструмент Diff для XML-файлов» , я нашел еще один инструмент, который утверждает, что он контекстно-зависим для нескольких языков программирования: Compare++ , который хвастается следующий:

По сравнению с другими инструментами сравнения файлов, в Compare++ отличный процесс заключается в использовании механизма структурированного сравнения с учетом языка с двумя режимами сравнения («Ориентированный на код» и «Ориентированный на текст») для сравнения исходных файлов. Благодаря полному пониманию структур кода вы можете получить более точные результаты сравнения кода и многочисленные функции пост-сравнения.
...
Чтобы помочь вам просмотреть изменения структуры кода, предоставляется закрепляемая панель «Просмотр функций», в которой перечислены все изменения структуры, такие как функции, классы или пространства имен ( измененные , удаленные или добавленные ).

...

Структурированное сравнение с учетом языка для C/C++, Java, C#, Javascript, CSS, ...

  • Compare++ анализирует исходные файлы со встроенным анализом для C/C++, C#, Java, php, html, Javascript, CSS3 и других языков, автоматически извлекает структурированное дерево кода и выделяет синтаксис.
  • Он может НЕ ТОЛЬКО сравнивать содержимое файла, но также отображать и сообщать обо всех функциях, классах, изменениях пространств имен в параллельном представлении функций.
  • В представлении функций вы можете настроить режим фильтра, чтобы отображались только измененные функции.

Программа не является бесплатной (29,95 долларов США за пользователя), но вы можете попробовать ее без лицензии в течение 30 дней.

Я не уверен, действительно ли он предполагает, что код перемещен, или это требует некоторого ручного труда, но он утверждает, что в представлении функций он может определить, был ли он изменен, удален или добавлен.

ПС! Кстати, он обрабатывает html, так что, возможно, он также может обрабатывать xml?
ППС! Вот инструмент в python для сравнения XML (который, возможно, можно было бы заменить на сравнение json (если преобразовать в etree)). Однако похоже, что это написано для проверки на равенство и не обеспечивает такой визуальной обратной связи.

Недавно я нашел json-delta по адресу https://pypi.python.org/pypi/json-delta/.

Вы можете установить на свой компьютер командой

pip install json-delta

Чтобы использовать его, просто используйте команду

json_diff -u file1.json file2.json
JSON-delta чувствителен к порядку при сравнении массивов в JSON, поэтому, хотя это очень полезный инструмент, он не соответствует критериям OP. Одно замечание: если вы сравниваете файлы JSON, которые содержат данные, которые, как ожидается, изменятся (например, временные метки), json-delta можно использовать для удаления этих данных (с помощью возможности исправления) перед выполнением сравнения.

Это может быть полезно:

Это инструмент командной строки.

Онлайн-версию, которая также может загружать файлы с диска, см. здесь: http://www.jsondiff.com/

Есть еще один ответ, который уже предлагает тот же самый инструмент.
@ Алехандро Нет, нет; обратите внимание на дефис

Вы можете использовать потрясающие онлайн-инструменты, такие как: - JSON Compare JSON Diff

Добро пожаловать в SoftwareRecs, но это ответ низкого качества. 1. Ваши ссылки перевернуты 2. JSON Diff уже упоминается в другом месте 3. Это ответ только для ссылки и есть риск удаления softwarerecs.meta.stackexchange.com/questions/624/… Пожалуйста , отредактируйте ответ

Просто используйте диф. Как в

diff --unified file1.json file2.json

( источник , подробности на --unified )

ИМХО, это во многом линейно, и порядок имеет значение, чего ОП не хочет. Следовательно, это не отвечает на вопрос.
@ThomasWeller, ты прав. Два файла из описания вопроса не считаются равными. Я могу удалить его, хотя это решение все еще может помочь кому-то (как оно помогло мне).