如何通过 JSONPath 按其中的特定值过滤整个字典?
How to filter for a whole dictionary by a specific value inside it via JSONPath?
我(刚刚)了解到 JSONPath 是我可以通过给定键名或数组索引等来 filter/select 部分 JSON 字符串。
结果是 that key/value 我在 JSONPath 表达式中给出的。
但是,结果,我想得到整个字典,其中包含我要过滤的 key/value 对——不仅是 key/value 对。
例如,想象以下 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
}
]
现在假设我想要获取那些数组元素(完整的,以及它们的所有数据),其中“preset”命名字典中“id”的值等于“16”。 JSONPath 查询字符串是什么?
记住:我不想得到 just { „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
}
而且我不想在任何编程语言的一些编码 project/a program/source 代码中执行此操作。相反,我有一个 REST API 工具,我可以在其中使用 JSON 路径查询字符串过滤 JSON 响应(它是 i[Pad][=51 的应用程序“HTTPBot” =]).
这里有一些JSON我试过但没有给出我想要的结果的路径示例:
$..preset
– returns 所有 预设的dicts(有特定id值的不过滤)
$..preset.id
– returns 所有预设字典中所有 id 键的所有值(同样,不过滤某个 id)
$..preset[?(@.id==„16“)]
– 这是我认为应该做的事情,但在 HTTPBot 中这只是 returns 与 $..preset
相同(也许我应该问 HTTPBot 的作者他是否实现了JSON路径完整?!)
$..preset
将对任何 属性(在任何深度)调用 preset
和 return 这些属性中所有值的集合执行递归搜索.
要获取项目,您需要有一个作用于它们的选择器。由于您要过滤项目,因此您正在查看过滤器选择器 [?(<expr>)]
.
在 JSON 路径表达式中,您可以使用 @
查看每个项目,因为选择器迭代数组,它支持从中构建路径。我们希望 @.preset.id
为 16
,因此我们可以使用
$[?(@.preset.id=='16')]
我(刚刚)了解到 JSONPath 是我可以通过给定键名或数组索引等来 filter/select 部分 JSON 字符串。 结果是 that key/value 我在 JSONPath 表达式中给出的。 但是,结果,我想得到整个字典,其中包含我要过滤的 key/value 对——不仅是 key/value 对。
例如,想象以下 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
}
]
现在假设我想要获取那些数组元素(完整的,以及它们的所有数据),其中“preset”命名字典中“id”的值等于“16”。 JSONPath 查询字符串是什么? 记住:我不想得到 just { „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
}
而且我不想在任何编程语言的一些编码 project/a program/source 代码中执行此操作。相反,我有一个 REST API 工具,我可以在其中使用 JSON 路径查询字符串过滤 JSON 响应(它是 i[Pad][=51 的应用程序“HTTPBot” =]).
这里有一些JSON我试过但没有给出我想要的结果的路径示例:
$..preset
– returns 所有 预设的dicts(有特定id值的不过滤)$..preset.id
– returns 所有预设字典中所有 id 键的所有值(同样,不过滤某个 id)$..preset[?(@.id==„16“)]
– 这是我认为应该做的事情,但在 HTTPBot 中这只是 returns 与$..preset
相同(也许我应该问 HTTPBot 的作者他是否实现了JSON路径完整?!)
$..preset
将对任何 属性(在任何深度)调用 preset
和 return 这些属性中所有值的集合执行递归搜索.
要获取项目,您需要有一个作用于它们的选择器。由于您要过滤项目,因此您正在查看过滤器选择器 [?(<expr>)]
.
在 JSON 路径表达式中,您可以使用 @
查看每个项目,因为选择器迭代数组,它支持从中构建路径。我们希望 @.preset.id
为 16
,因此我们可以使用
$[?(@.preset.id=='16')]