Как сравнить два ответа JSon, когда порядок ответов отличается

#java #json #compare

Вопрос:

Ниже приведен ответ, который я получаю на два моих вызова API, ответ один и тот же, но порядок данных не указан:

 {"URI":"CoGroup/2","level":"total","name":null,"code":null,"baseColor":null,"secondaryColor":null,"selected":null,"value":317978,"Byyear":[],"count":10499},
{"URI":"integer/7005","level":"total","name":null,"code":null,"baseColor":null,"secondaryColor":null,"selected":null,"value":26857,"Byyear":[],"count":4542},
{"URI":"intgroup/78","level":"total","name":null,"code":null,"baseColor":null,"secondaryColor":null,"selected":null,"value":105304,"Byyear":[],"count":1653}
]

[
{"URI":"CoGroup/2","level":"total","name":null,"code":null,"baseColor":null,"secondaryColor":null,"selected":null,"value":317978,"Byyear":[],"count":10499},
{"URI":"intgroup/78","level":"total","name":null,"code":null,"baseColor":null,"secondaryColor":null,"selected":null,"value":105304,"Byyear":[],"count":1653},
{"URI":"integer/7005","level":"total","name":null,"code":null,"baseColor":null,"secondaryColor":null,"selected":null,"value":26857,"Byyear":[],"count":4542}
]
 

Я попытался использовать Джексона для сравнения ответов с помощью mapper.readtree, но результаты возвращаются как ложные.

 ObjectMapper mapper1 = new ObjectMapper();
ObjectMapper mapper2 = new ObjectMapper();
try{
assertEquals(mapper1.readTree(respStr1), mapper2.readTree(respStr2));
}
catch(Exception e) {
System.out.println(e);
}

and 

ObjectMapper mapper1 = new ObjectMapper();
JsonNode tree1 = mapper1.readTree(respStr1);
JsonNode tree2 = mapper1.readTree(respStr2);
System.out.println(tree1.equals(tree2));

 

Любые предложения о том, как подойти для сравнения здесь….

Ответ №1:

Для этой цели вы можете использовать библиотеку JSONAssert от scyscreamer.

Это сработало бы так:

 // respStr1 and respStr2 are the two json in string
JSONAssert.assertEquals(respStr1, respStr2, JSONCompareMode.NON_EXTENSIBLE);

 

NON_EXTENSIBLE режим позволит передать утверждение, если json отличается только по порядку.

Изменить: JSONCompare.compareJSON(respStr1, respStr2, CompareMode.NON_EXTENSIBLE).passed() вернется, если сравнение прошло.

Комментарии:

1. Как я могу получить результат сравнения в виде логического значения?

2. JSONCompare.compareJSON(respStr1, respStr2, CompareMode.NON_EXTENSIBLE).passed() вернется, если сравнение прошло.

3. любые предложения, если сравнение не выполняется с десятичной запятой, как это можно решить, пока я использую CompareMode.NON_EXTENSIBLE