如何验证JSON中是否存在JSON路径

时间:2017-04-12 07:03:00

标签: json jsonpath

在给定的json文档中,如何验证json路径是否存在?

我正在使用jayway-jsonpath并拥有以下代码

JsonPath.read(jsonDocument, jsonPath)

以上代码可能会抛出异常

  

com.jayway.jsonpath.PathNotFoundException:路径没有结果:   $ [' A.B.C']

为了减轻它,我打算在尝试使用 JsonPath.read

读取路径之前验证路径是否存在

作为参考,我经历了以下两个文件,但无法得到我想要的东西。

  1. http://www.baeldung.com/guide-to-jayway-jsonpath
  2. https://github.com/json-path/JsonPath

2 个答案:

答案 0 :(得分:4)

虽然您可以捕获异常,但是在评论中提到它可能有一种更优雅的方式来检查路径是否存在而无需在整个代码中编写try catch块。

您可以对jayway-jsonpath使用以下配置选项:

com.jayway.jsonpath.Option.SUPPRESS_EXCEPTIONS

如果激活此选项,则不会引发任何异常。如果您使用 read 方法,只要找不到路径,它就会返回 null

以下是JUnit 5和AssertJ的示例,展示了如何使用此配置选项,避免使用try / catch块来检查是否存在json路径:

@ParameterizedTest
@ArgumentsSource(CustomerProvider.class)
void replaceStructuredPhone(JsonPathReplacementArgument jsonPathReplacementArgument) {
    DocumentContext dc = jsonPathReplacementHelper.replaceStructuredPhone(
            JsonPath.parse(jsonPathReplacementArgument.getCustomerJson(),
                    Configuration.defaultConfiguration().addOptions(Option.SUPPRESS_EXCEPTIONS)),
            "$.cps[5].contactPhoneNumber", jsonPathReplacementArgument.getUnStructuredPhoneNumberType());
    UnStructuredPhoneNumberType unstructRes = dc.read("$.cps[5].contactPhoneNumber.unStructuredPhoneNumber");
    assertThat(unstructRes).isNotNull();
    // this path does not exist, since it should have been deleted.
    Object structRes = dc.read("$.cps[5].contactPhoneNumber.structuredPhoneNumber");
    assertThat(structRes).isNull();
}

答案 1 :(得分:0)

如果您有用例来检查多个路径,还可以使用ReadContext创建JsonPath对象或Configuration

    // Suppress errors thrown by JsonPath and instead return null if a path does not exist in a JSON blob.
    Configuration suppressExceptionConfiguration = Configuration
            .defaultConfiguration()
            .addOptions(Option.SUPPRESS_EXCEPTIONS);
    ReadContext jsonData = JsonPath.using(suppressExceptionConfiguration).parse(jsonString);

    for (int i = 0; i < listOfPaths.size(); i++) {
        String pathData = jsonData.read(listOfPaths.get(i));
        if (pathData != null) {
            // do something
        }