Как удалить значение ключа json с помощью JSonPath в java - PullRequest
0 голосов
/ 01 мая 2020

Я знаю, что это может быть дубликат, но все еще публикую свой вопрос, так как я не смог найти точный ответ, который я ищу. У меня есть json объект (или строка), как показано ниже.

String str = "{
    "status" : {
        "timestamp" : "2020-04-30T01:00:00 000Z"
        "error" : 0,
        "error_message" : null,
        "execution" : "completed"
    }
}
";

Я получу такой же ответ от моего тестирования REST API, но после каждого вызова ключ 'timestamp' будет иметь динамическое c значение даты и времени со временем относительно звонок сделан. И здесь я сравниваю мое ожидание json с фактическим json как целое сравнение с помощью JSONAssert. Поскольку значение метки времени отличается, оно всегда терпит неудачу для меня.

Итак, мой вопрос, прежде чем я сделаю какое-либо сравнение, я бы хотел удалить ключ 'timestamp' и его значение из json для сравнения, и он пройдет мой случай. Я попытался с помощью JsonPath также, но не работает. Любая помощь в этом, пожалуйста?

1 Ответ

0 голосов
/ 01 мая 2020

JSONAssert позволяет создавать настраиваемый компаратор при выполнении утверждений [1].

В вашем случае это просто:

JSONAssert.assertEquals(expectedJson,
                        actualJson,
                        new CustomComparator(JSONCompareMode.LENIENT,
                                            skips("status.timestamp","another.json.path", ...)));

private static Customization[] skips(String... jsonPaths) {
    return Arrays.stream(jsonPaths)
                 .map(jsonPath -> Customization.customization(jsonPath, (o1, o2) -> true))
                 .toArray(Customization[]::new);
}

Здесь мы определяем CustomComparator с помощью customization, который принимает JSONPath (status.timestamp) и принимает ValueMatcher (лямбда), который сравнивает два значения для этого параметра c JSONPath.

В нашем случае мы всегда будем возвращать true, что будет эффективно пропускает значение (независимо от того, с чем мы сравниваем это значение, оно всегда истинно).

Редактировать: Как вы можете видеть, конструктор CustomComparator принимает varargs из Customization s, следовательно, вы можете укажите несколько полей, которые будут игнорироваться из сравнения.


[1] http://jsonassert.skyscreamer.org/apidocs/org/skyscreamer/jsonassert/Customization.html

[2] http://jsonassert.skyscreamer.org/apidocs/org/skyscreamer/jsonassert/comparator/CustomComparator.html

...