提问人:Naveen Chand K 提问时间:2/22/2023 更新时间:2/22/2023 访问量:143
JSONPath 表达式中以给定字符开头的筛选器和输出值
Filter and output values in JSONPath Expression that begins with given characters
问:
我有一个结构如下的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"
]
这很好,但是如果我必须只过滤那些以给定字符集开头(以)开头的值,或者如何编写表达式。在这种情况下,所需的输出应如下所示:iph
iPhone
[
"iPhone",
"iPhone 6S",
"iPhone 14"
]
答:
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.*/))]
评论