首页 > 解决方案 > 如何通过 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 示例,但没有给出我想要的结果:

标签: jsonpath

解决方案


$..preset将对调用的任何属性(在任何深度)执行递归搜索,preset并返回这些属性中所有值的集合。

要获取项目,您需要有一个作用于它们的选择器。由于您要过滤项目,因此您正在查看过滤器选择器[?(<expr>)]

在 JSON 路径表达式中,您可以@在选择器迭代数组时使用 来查看每个项目,并且它支持从中构建路径。我们希望@.preset.id成为16,所以我们可以使用

$[?(@.preset.id=='16')]

推荐阅读