Я ищу библиотеку анализа JSON, которая поддерживает сравнение двух объектов JSON, игнорирующих дочерний порядок, особенно для модульного тестирования JSON, возвращающегося из веб-службы.
Поддерживает ли это какая-либо из основных библиотек JSON? Библиотека org.json просто выполняет сравнение ссылок.
toString()
преобразование объекта вJSON
строку.Ответы:
В качестве общего архитектурного аспекта я обычно советую не допускать, чтобы зависимости от конкретного формата сериализации выходили за пределы вашего уровня хранения / сети; таким образом, я бы сначала рекомендовал рассмотреть возможность проверки равенства между собственными объектами приложения, а не их проявлениями JSON.
Сказав это, я в настоящее время большой поклонник Джексона, который, как показывает мой краткий обзор их реализации ObjectNode.equals (), выполняет сравнение набора членов, которое вы хотите:
источник
Попробуйте JSONAssert от Skyscreamer .
Его строгий режим имеет два основных преимущества, которые делают его менее хрупким:
В строгом режиме он больше похож на тестовый класс json-lib.
Тест выглядит примерно так:
Параметры в JSONAssert.assertEquals () вызова являются expectedJSONString , actualDataString и isStrict .
Полученные сообщения довольно ясны, что важно при сравнении действительно больших объектов JSON.
источник
JSONAssert.assertEquals(expected, data, JSONCompareMode.NON_EXTENSIBLE);
режим NON_EXTENSIBLE означает, что любые новые или пропущенные поля вызывают сбои, а порядок - нет. Использование false вызовет снисходительный режим, который не будет сообщать о каких-либо дополнительных или отсутствующих дочерних элементах.Использование GSON
Редактировать: С GSON v2.8.6, метод экземпляра
JsonParser.parse
устарел. Вы должны использовать статический методJsonParser.parseString
:источник
Я бы сделал следующее,
источник
Вы можете попробовать использовать класс JSONAssert от json-lib :
дает:
источник
JSONAssert.assertJsonEquals( "{foo: 'bar', list: [{test: '1'}, {rest: '2'}] }", "{ foo: 'bar', list: [{rest: '2'}, {test: '1'}] }");
С сообщением:junit.framework.AssertionFailedError: : : objects differed at key [list];: arrays first differed at element [0];: objects differed at key [test];
Используйте эту библиотеку: https://github.com/lukas-krecan/JsonUnit
Pom:
IGNORING_ARRAY_ORDER - игнорирует порядок в массивах
источник
Если вы уже используете JUnit, в последней версии теперь используется Hamcrest. Это общая структура сопоставления (особенно полезная для модульного тестирования), которую можно расширить для создания новых сопоставителей.
Существует небольшая библиотека
hamcrest-json
с открытым исходным кодом, которая называется с JSON-совместимыми совпадениями. Это хорошо документировано, протестировано и поддерживается. Ниже приведены несколько полезных ссылок:Пример кода с использованием объектов из библиотеки JSON
org.json.simple
:При желании вы можете (1) разрешить массивы «любого порядка» и (2) игнорировать дополнительные поля.
Поскольку существует множество библиотек JSON для Java (
Jackson
,GSON
,json-lib
и т.д.), это полезно , чтоhamcrest-json
поддерживает JSON текст (какjava.lang.String
), а также изначально поддерживающие объекты из библиотеки JSON Дугласа Крокфорда вorg.json
.Наконец, если вы не используете JUnit, вы можете использовать Hamcrest напрямую для утверждений. ( Я написал об этом здесь. )
источник
Вы можете попробовать JsonUnit . Он может сравнивать два объекта JSON и сообщать о различиях. Он построен на вершине Джексона.
Например
Результаты в
источник
Одна вещь, которую я сделал, и она творит чудеса - это прочитать оба объекта в HashMap, а затем сравнить с обычным assertEquals (). Он вызовет метод equals () хеш-карт, который будет рекурсивно сравнивать все объекты внутри (это будут либо другие хеш-карты, либо какой-либо объект с одним значением, например, строка или целое число). Это было сделано с помощью JSON-парсера Codehaus JSON.
Аналогичный подход можно использовать, если вместо этого объект JSON является массивом.
источник
Я использую это, и отлично работает для меня (с org.json. *):
источник
Для org.json я развернул свое собственное решение, метод, который сравнивается с экземплярами JSONObject. Я не работал со сложными объектами JSON в этом проекте, поэтому я не знаю, работает ли это во всех сценариях. Кроме того, учитывая, что я использую это в модульных тестах, я не прикладывал усилий к оптимизации. Вот:
источник
val1
равно null, вы получитеif (!val1.equals(val2)) {
js2
естьnull
или нет, когдаjs1
нетnull
Вы можете использовать библиотеку zjsonpatch , которая представляет информацию о различиях в соответствии с RFC 6902 (JSON Patch). Его очень легко использовать. Пожалуйста, посетите страницу описания для его использования
источник
Я бы взял библиотеку по адресу http://json.org/java/ и
equals
изменил метод JSONObject и JSONArray, чтобы выполнить тест на глубокое равенство. Чтобы убедиться, что он работает независимо от порядка дочерних элементов, все, что вам нужно сделать, это заменить внутреннюю карту наTreeMap
или использовать что-то подобноеCollections.sort()
.источник
Попробуй это:
источник
if (obj1Array.length() != obj2Array.length())
не гарантирует, что все элементы совпадают?Я знаю, что это обычно рассматривается только для тестирования, но вы можете использовать Hamcrest JSON compitorSameJSONAs в Hamcrest JSON.
Hamcrest JSON SameJSONAs
источник
Каратэ это именно то, что вы ищете. Вот пример:
(отказ от ответственности: dev здесь)
источник
Для сравнения jsons я рекомендую использовать JSONCompare: https://github.com/fslev/json-compare
источник
Для таких как я, желающих сделать это с Джексоном, вы можете использовать json-unit .
Ошибки дают полезную информацию о типе несоответствия:
источник
Ничто другое, казалось, не работало совершенно правильно, поэтому я написал это:
источник
Следующий код будет более полезным для сравнения двух JsonObject, JsonArray, JsonPrimitive и JasonElements.
источник
https://tech.blobcity.com/2018/09/02/json-equals-in-java-to-compare-two-jsons
источник
Глядя на ответы, я попробовал JSONAssert, но это не удалось. Поэтому я использовал Джексона с zjsonpatch. Я разместил подробности в SO ответе здесь .
источник
Это решение для меня, работа очень хорошая:
Надеюсь, что это поможет другим.
источник