当前位置: 首页 > 知识库问答 >
问题:

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

林承悦
2023-03-14

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

我使用的是jayway jsonpath,代码如下

JsonPath.read(jsonDocument, jsonPath)

上述代码可能会引发以下异常

通用域名格式。乱穿马路。jsonpath。PathNotFoundException:路径:$['a.b.c']没有结果

为了缓解这种情况,我打算在尝试使用JsonPath读取该路径之前验证该路径是否存在。阅读

作为参考,我看了以下两个文档,但没有真正得到我想要的。

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

共有2个答案

方航
2023-03-14

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

    // 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
        }

汪修诚
2023-03-14

虽然您确实可以捕获异常,但就像注释中提到的那样,可能有一种更优雅的方法来检查路径是否存在,而无需在代码中到处写尝试捕获块。

可以在jayway-jsonpath中使用以下配置选项:

com.jayway.jsonpath.Option.SUPPRESS_EXCEPTIONS

此选项处于活动状态时,不会引发异常。如果使用read方法,只要没有找到路径,它就会简单地返回null。

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

@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();
}
 类似资料:
  • 问题内容: 有没有办法在不使用PHP的情况下检查变量是否为有效的JSON字符串?我没有PHP 5.3.3。 问题答案:

  • 问题内容: 我有以下内容,其中是是,并且由表示: 我的应用程序中还实现了另一个。 我的问题是,从我的第二个中找出我是否包含特定内容的最佳方法是什么? 我尝试过但没有成功: 问题答案: 为什么不: 而且,如果您必须遍历整个,而不是只寻找一个特定值: 编辑 过去,我用一些Java 8惯用语对此进行了更新。 Java 8流API允许使用更具声明性(并且可以说是优雅的)的方式来处理这些类型的迭代。 例如,

  • 问题内容: 因此,我从服务器获取了一些JSON值,但我不知道是否会有特定的字段。 像这样: 有时,还会有一个额外的字段,例如: 我想检查名为“ club”的字段是否存在,以便在解析时不会得到 org.json.JSONException:club的值 问题答案: JSONObject类具有一个名为“ has”的方法: http://developer.android.com/reference/o

  • 问题内容: 我正在尝试使用Jackson JSON接受一个字符串,并确定它是否为有效JSON。谁能建议要使用的代码示例(Java)? 问题答案: 不知道您的用例是什么,但是应该这样做:

  • 问题内容: 我使用sf.json库在Java Web应用程序中映射传入请求的表单数据。 可以说传入请求是http:// localhost:8080 / app / addProfile ,其表单数据为: 服务器端 : 这种方法的主要问题是,如果对结构进行少量修改,则需要修改整个代码。 有没有可以配置验证所需规则的api? 问题答案: 您可以使用Json验证器:-https: //github.c

  • 我使用sf.json库来映射在java中的Web应用程序中传入请求的表单数据。 假设传入请求http://localhost:8080/app/addProfile表单数据为: 服务器端: 这种方法的主要问题是,如果在结构中有微小的修改,那么整个代码都需要修改。 是否有api可以配置验证所需的规则?