Как comapre 2 JSON фильтруется с несколькими путями JSON с одним сравнением?
Есть 2 json, есть несколько путей, которые необходимо применить к обоим json. Затем эти jsons должны сравниваться с помощью некоторого утверждения в тесте. Идеальное решение должно быть:
Stirng actualJson - ....
Stirng expectedJson - ....
Stirng actualJsonFiltered - filter(actualJson, lisofJsonPath);
Stirng expectedJsonFiltered - filter(expectedJson, lisofJsonPath);
JSONAssert.assertEquals(actualJsonFiltered, expectedJsonFiltered);
Что не является решением: 1. Любой код, подобный этому:
for(String p: lisofJsonPath) {
assertEquals(JsonPath.read(actualJson, p), JsonPath.read(expectedJson , p);
}
Необходимо отфильтровать jsons и показать / потерпеть неудачу со всем существующим путем. Покажите ошибку, что несколько путей не совпадают. Не по одному JSON соответствия пути.
org.assertj.core.api.SoftAssertions
- также не является решением, потому что из сообщения трудно понять, какие активы потерпели неудачу.harcrest
allOf
/anyOf
также не является решением, потому что оно не дает результатов при первой согласованной сборке, а не объединяет их.
PS Любые предложения по визуализации json diff приветствуются. Идеальный способ выглядит следующим образом. (но это в JavaScript)
1 ответ
Сначала примите следующее:
- JSON - это неупорядоченная коллекция пар ключ-значение.
- Трудно сравнить неупорядоченную коллекцию чего-либо.
- Если вы заказываете пары ключ-значение (отсортированные по ключу) и представляете значение JSON в виде строки (например: "{\" keyA \ ": \" blam \ ", \" keyB \ ": \" kapow \ "}") вы можете сравнить значения JSON, используя сравнение строк.
Я назову отсортированную форму JSON "канонической формой JSON".
Как только вы примете вышесказанное как истинное и / или реальное, это станет решением вашей проблемы:
- Создайте инструмент (возможно, один класс), который принимает JSON и выводит каноническую форму JSON (это нетривиальная часть этого решения):
- Получите каноническую форму JSON для обоих ваших значений JSON.
- Сравните канонические формы JSON, используя
assertEquals
,