JSONPath 表达式中以给定字符开头的筛选器和输出值

Filter and output values in JSONPath Expression that begins with given characters

提问人:Naveen Chand K 提问时间:2/22/2023 更新时间:2/22/2023 访问量:143

问:

我有一个结构如下的JSON。我仅使用 JSONPath 表达式来过滤值。如何过滤并仅输出那些值的前三个字符与给定三个字符匹配的值。

[
  {
    "firstName": "John",
    "lastName": "doe",
    "age": 26,
    "address": {
      "streetAddress": "naist street",
      "city": "Nara",
      "postalCode": "630-0192"
    },
    "phoneNumbers": [
      {
        "model": "iPhone",
        "number": "0123-4567-8888"
      },
      {
        "model": "iPhoneX",
        "number": "0123-4567-8910"
      }
    ]
  },
  {
    "firstName": "Ram",
    "lastName": "Pavan",
    "age": 29,
    "address": {
      "streetAddress": "Delhi street",
      "city": "Noid",
      "postalCode": "222-211"
    },
    "phoneNumbers": [
      {
        "model": "iPhone 6S",
        "number": "43212-888-9998"
      },
      {
        "model": "iPhone 14",
        "number": "84848-337-83330"
      }
    ]
  }
]

在上面的示例 JSON 中,我使用以下 JSONPath 表达式成功过滤了所有作为键的值:model

$..model

正如预期的那样,输出是所有模型的列表:

[
  "iPhone",
  "Samsung",
  "iPhone 6S",
  "iPhone 14"
]

这很好,但是如果我必须只过滤那些以给定字符集开头(以)开头的值,或者如何编写表达式。在这种情况下,所需的输出应如下所示:iphiPhone

[
  "iPhone",
  "iPhone 6S",
  "iPhone 14"
]
javascript 切片 jsonpath json-path-expression

评论


答:

0赞 Naveen Chand K 2/22/2023 #1

经过一些试验,我尝试将 Javascript 方法应用于这些值。但在此之前,我还必须上升一级,然后使用过滤器和组合过滤该父级下的元素。slice()?slice

这是对我有用的代码:

$..phoneNumbers[?((@.model).slice(0,3) == "iPh")].model

Slice 方法有两个参数(start、end)。在这种情况下,起始索引为 0,结束索引为 3,它们应等于“iPh”。

所需输出:

[
  "iPhone",
  "iPhone 6S",
  "iPhone 14"
]

评论

1赞 Akshay G 2/22/2023
您还可以使用正则表达式$..phoneNumbers[?(@.model.match(/^iPhone.*/))]
0赞 Naveen Chand K 2/26/2023
非常好。您建议的表达方式效果很好。我尝试使用前三个字符进行过滤,但它仍然有效:$..phoneNumbers[?(@.model.match(/^iPh.*/))]