使用Jayway的可选JsonPath

19

问题:

我有一个服务,它以JSON字符串作为输入。每次JSON模式都不同,其中某些字段并不总是存在。当这些字段存在时,如何使用Jayway的JsonPath查询这些字段的值?

我尝试过的:

我使用了Jayway的自述页面中解释的Option.DEFAULT_PATH_LEAF_TO_NULL

Configuration config = Configuration.defaultConfiguration()
    .addOptions(Option.DEFAULT_PATH_LEAF_TO_NULL);
if (JsonPath.isPathDefinite(attribute.jsonPath))
{
    String value = JsonPath.using(config).parse(currentTx).read(attribute.jsonPath);
    if (value != null)
    {
        attributeValues.add(value);
    }
}
else
{
    List<String> attributeValuesArray = JsonPath.using(config).parse(currentTx).read(attribute.jsonPath);

    for (String value : attributeValuesArray)
    {
        if (value != null)
        {
            attributeValues.add(value);
        }
    }
}

我希望这样做能让JsonPath.read()在找不到路径时返回null, 但我的代码仍然会抛出以下异常:

com.jayway.jsonpath.PathNotFoundException: Missing property in path $['somepath']

当我给它一个不存在的路径时。有人知道可能是什么原因吗?

1个回答

20

我意识到了我的错误。 DEFAULT_PATH_LEAF_TO_NULL选项只处理叶节点。例如:

示例Json

{
    "foo":{
        "bar":"value"
    }
}

如果查询 $.foo.tmp,JsonPath 将返回 null,因为 tmp 应该是叶节点。

如果查询 $.tmp.tmp2,JsonPath 将抛出

com.jayway.jsonpath.PathNotFoundException,因为 tmp 不是叶节点且不存在。

为了解决这个问题,应该使用 Option.SUPPRESS_EXCEPTIONS


2
我们如何自动添加这些路径?有没有办法这样做。 - kanchan
1
谢谢你的回答。Option.SUPPRESS_EXCEPTIONS解决了我的问题,这个问题和你的类似。 - VAIBHAV GOUR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接