jsonpath - 如何通过 JSONPath 通过其中的特定值过滤整个字典?
问题描述
我(刚刚)学到的关于 JSONPath 的全部内容是,我可以通过提供键名或数组索引等来过滤/选择 JSON 字符串的一部分。结果是我在 JSONPath 表达式中给出的键/值。但是,因此,我想获得整个字典,其中包含我要过滤的键/值对——不仅仅是那个键/值对。
例如,想象以下 JSON 字符串:
[
{
„date“: „2021-06-18T10:23:45.000+0000“,
„material“: {
„key1“: „value1“,
„key2“: „value2“
},
„preset“: {
„duration“: [ 120, 180 ],
„increments“: 3,
„id“: „16“,
„uniqueId“: „1357924680“
},
„userId“: 23456
},
{
„date“: „2021-06-18T08:15:45.000+0000“,
„material“: {
„key1“: „value1“,
„key2“: „value2“
},
„preset“: {
„duration“: [ 180 ],
„increments“: 1,
„id“: „10“,
„uniqueId“: „1797924680“
},
„userId“: 23456
},
{
„date“: „2021-06-16T17:12:23.000+0000“,
„material“: {
„key1“: „value1“,
„key2“: „value2“
},
„preset“: {
„duration“: [ 240 ],
„increments“: 1,
„id“: „10“,
„uniqueId“: „1357944680“
},
„userId“: 23456
},
{
„date“: „2021-06-09T08:45:45.000+0000“,
„material“: {
„key1“: „value1“,
„key2“: „value2“
},
„preset“: {
„duration“: [ 120, 180 ],
„increments“: 3,
„id“: „16“,
„uniqueId“: „2357924680“
},
„userId“: 23456
}
]
现在假设我想获取那些数组元素(完全,以及它们的所有数据),其中在“预设”命名字典中,“id”的值等于“16”。什么是 JSONPath 查询字符串?请记住:我不想只得到{ „id“: „16“, „id“: „16“ } 作为结果,而是在这种情况下获得包含两个结果的整个字典:
{
„date“: „2021-06-18T10:23:45.000+0000“,
„material“: {
„key1“: „value1“,
„key2“: „value2“
},
„preset“: {
„duration“: [ 120, 180 ],
„increments“: 3,
„id“: „16“,
„uniqueId“: „1357924680“
},
„userId“: 23456
},
{
„date“: „2021-06-09T08:45:45.000+0000“,
„material“: {
„key1“: „value1“,
„key2“: „value2“
},
„preset“: {
„duration“: [ 120, 180 ],
„increments“: 3,
„id“: „16“,
„uniqueId“: „2357924680“
},
„userId“: 23456
}
而且我不想在任何编程语言的一些编码项目/程序/源代码中执行此操作。相反,我有一个 REST API 工具,我可以在其中使用 JSONPath 查询字符串过滤 JSON 响应(它是适用于 i[Pad]OS 的应用程序“HTTPBot”)。
以下是我尝试过的一些 JSONPath 示例,但没有给出我想要的结果:
$..preset
- 返回所有预设的dicts(对具有特定id值的不过滤)$..preset.id
– 返回所有预设 dicts 中所有 id 键的所有值(同样,不对某个 id 进行过滤)$..preset[?(@.id==„16“)]
– 这是我认为应该做的伎俩,但在 HTTPBot 这只是返回相同$..preset
(也许我应该问 HTTPBot 的作者他是否完全实现了 JSONPath?!)
解决方案
$..preset
将对调用的任何属性(在任何深度)执行递归搜索,preset
并返回这些属性中所有值的集合。
要获取项目,您需要有一个作用于它们的选择器。由于您要过滤项目,因此您正在查看过滤器选择器[?(<expr>)]
。
在 JSON 路径表达式中,您可以@
在选择器迭代数组时使用 来查看每个项目,并且它支持从中构建路径。我们希望@.preset.id
成为16
,所以我们可以使用
$[?(@.preset.id=='16')]
推荐阅读
- r - dplyr 等效于 sql row_number() over(按组按值分区)
- kendo-grid - MVC Kendo Combobox 从 DataSource 设置值
- regex - 第一个和最后一个括号之间的匹配字符串
- jsf - 可以在专用网络上保留未加密的视图状态吗?
- directory - 将 OpenDJ 迁移到目录服务 6.5
- django - Django:如何在 Factory Boy 工厂和序列化程序中正确使用 ManyToManyField?
- html - BootStrap Jumbotron 宽度
- gdi+ - GDI+ 将图像透明部分的颜色重置为黑色
- vue.js - Materialise CSS Modal 不适用于 Vue
- javascript - 使用 FileReader 时如何在 typescript 中使用回调函数?角 5