JsonPath - 过滤数组并仅获取第一个元素

3

我正在尝试过滤这个JSON数组的元素,以返回它找到的第一个元素。

{
    "elements": [{
        "urn": "urn:li:lyndaCourse:189800",
        "details": {
            "classifications": [{
                    "associatedClassification": {
                        "urn": "urn:li:lyndaCategory:9331",
                        "type": "LIBRARY"
                    }
                },
                {
                    "associatedClassification": {
                        "urn": "urn:li:lyndaCategory:8982",
                        "type": "SUBJECT"
                    }
                },
                {
                    "associatedClassification": {
                        "urn": "urn:li:lyndaCategory:8920",
                        "type": "LIBRARY"
                    }
                }
            ]
        }
    }]
}

但是这会导致一个空数组[]
我在https://jsonpath.herokuapp.com/上尝试了这个JSONPATH查询。 $.elements[0].details.classifications..associatedClassification[?(@.type=='LIBRARY')][0] 期望得到的结果是:
[{
    "urn": "urn:li:lyndaCategory:9331",
    "type": "LIBRARY"
}]
2个回答

2
另一种过滤信息的方法是通过过滤属性“classification”(不使用“..”),并在过滤器中使用“associatedClassification.type”,因此您应该有类似于以下内容的东西:
$.elements[0].details.classifications[?(@.associatedClassification.type=='LIBRARY')]

通过上述JSONPATH,您将获得所有类型为“LIBRARY”的项目(在您的示例中将返回2个项目)。
您提到您只需要过滤后的第一个项目,据我所调查,似乎没有可能仅使用JSONPATH返回第一个项目(请参见下面的线程)。

https://github.com/json-path/JsonPath/issues/272


1
在我的测试中,..是有效的,并且这里也有文档 https://github.com/json-path/JsonPath#:~:text=books%20and%20bicycles-,%24.store..price,-The%20price%20of。但我的主要问题是如何获取结果集的第一个项目,看起来似乎无法仅通过jsonpath实现。 - Infor.KS
你说得完全正确,我不知道这一点,我会修改答案,谢谢。 - Brank Victoria

1

以下内容适用于所有元素:

$..classifications[?(@.associatedClassification.type=='LIBRARY')]

并返回所有匹配的associatedClassification对象列表。

JSONPath 应该指向原始文档内部。因此,从结果列表中获取第一个元素需要进行后处理,例如单独的 JSONPath。

$.[0]

谢谢!我花了很多时间才找到这个解决方案。 - undefined

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