Как 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 соответствия пути.

  1. org.assertj.core.api.SoftAssertions - также не является решением, потому что из сообщения трудно понять, какие активы потерпели неудачу.

  2. harcrest allOf/anyOf также не является решением, потому что оно не дает результатов при первой согласованной сборке, а не объединяет их.

PS Любые предложения по визуализации json diff приветствуются. Идеальный способ выглядит следующим образом. (но это в JavaScript)

1 ответ

Сначала примите следующее:

  1. JSON - это неупорядоченная коллекция пар ключ-значение.
  2. Трудно сравнить неупорядоченную коллекцию чего-либо.
  3. Если вы заказываете пары ключ-значение (отсортированные по ключу) и представляете значение JSON в виде строки (например: "{\" keyA \ ": \" blam \ ", \" keyB \ ": \" kapow \ "}") вы можете сравнить значения JSON, используя сравнение строк.

Я назову отсортированную форму JSON "канонической формой JSON".

Как только вы примете вышесказанное как истинное и / или реальное, это станет решением вашей проблемы:

  1. Создайте инструмент (возможно, один класс), который принимает JSON и выводит каноническую форму JSON (это нетривиальная часть этого решения):
  2. Получите каноническую форму JSON для обоих ваших значений JSON.
  3. Сравните канонические формы JSON, используя assertEquals,
Другие вопросы по тегам