比较两个JSON时忽略特定的节点/属性

我想比较两个JSON字符串,它们是一个巨大的层次结构,并且想知道它们的值在哪里不同。但是某些值是在运行时生成的,并且是动态的。我想从比较中忽略那些特定的节点。

我目前正在使用来自 org.SkyScreamer的JSONAssert 进行比较。它为我提供了不错的控制台输出,但没有忽略任何属性。

对于前。

java.lang.AssertionError messageHeader.sentTime

expected:null

got:09082016 18:49:41.123

现在这是动态的,应该忽略。就像是

JSONAssert.assertEquals(expectedJSONString, actualJSONString,JSONCompareMode, *list of attributes to be ignored*)

如果有人建议使用JSONAssert解决方案,那将是很好的。但是,也欢迎其他方式。

回答:

您可以为此使用自定义。例如,如果您需要忽略名为“ timestamp”的顶级属性,请使用:

JSONAssert.assertEquals(expectedResponseBody, responseBody,

new CustomComparator(JSONCompareMode.LENIENT,

new Customization("timestamp", (o1, o2) -> true)));

也可以使用路径表达式,例如“

entry.id”。在自定义中,您可以使用任何喜欢的方法比较两个值。上面的示例始终返回true,无论期望值和实际值是多少。如果需要,您可以在那里做更复杂的事情。

完全可以忽略多个属性的值,例如:

@Test

public void ignoringMultipleAttributesWorks() throws JSONException {

String expected = "{\"timestamp\":1234567, \"a\":5, \"b\":3 }";

String actual = "{\"timestamp\":987654, \"a\":1, \"b\":3 }";

JSONAssert.assertEquals(expected, actual,

new CustomComparator(JSONCompareMode.LENIENT,

new Customization("timestamp", (o1, o2) -> true),

new Customization("a", (o1, o2) -> true)

));

}

使用自定义项时有一个警告:要以自定义方式比较其值的属性必须存在于实际JSON中。如果即使属性根本不存在,也希望比较成功,则必须重写CustomComparator,例如:

@Test

public void extendingCustomComparatorToAllowToCompletelyIgnoreCertainAttributes() throws JSONException {

// AttributeIgnoringComparator completely ignores some of the expected attributes

class AttributeIgnoringComparator extends CustomComparator{

private final Set<String> attributesToIgnore;

private AttributeIgnoringComparator(JSONCompareMode mode, Set<String> attributesToIgnore, Customization... customizations) {

super(mode, customizations);

this.attributesToIgnore = attributesToIgnore;

}

protected void checkJsonObjectKeysExpectedInActual(String prefix, JSONObject expected, JSONObject actual, JSONCompareResult result) throws JSONException {

Set<String> expectedKeys = getKeys(expected);

expectedKeys.removeAll(attributesToIgnore);

for (String key : expectedKeys) {

Object expectedValue = expected.get(key);

if (actual.has(key)) {

Object actualValue = actual.get(key);

compareValues(qualify(prefix, key), expectedValue, actualValue, result);

} else {

result.missing(prefix, key);

}

}

}

}

String expected = "{\"timestamp\":1234567, \"a\":5}";

String actual = "{\"a\":5}";

JSONAssert.assertEquals(expected, actual,

new AttributeIgnoringComparator(JSONCompareMode.LENIENT,

new HashSet<>(Arrays.asList("timestamp")))

);

}

(使用这种方法,您仍然可以使用“自定义”以所需的方式比较其他属性的值。)

以上是 比较两个JSON时忽略特定的节点/属性 的全部内容, 来源链接: utcz.com/qa/418352.html

回到顶部