我试图使用jsonpath package从JSON对象提取数据以遵循以下JSON结构-
[
{
"id": 1,
"images": [
{ "id": 1,"url": "http://url1.jpg" },
{ "id": 2,"url": "http://url2.jpg" }
]
},
{
"id": 2,
"images": [
{ "id": 3,"url": "http://url3.jpg" },
{ "id": 4,"url": "http://url4.jpg" }
]
},
{
"id": 3,
"images": [
{ "id": 5,"url": "http://url5.jpg" },
{ "id": 6,"url": "http://url6.jpg" }
]
}
]
在上面的示例中, $..id
json-path表达式使用以下数组进行响应-
[ 1, 1, 2, 2, 3, 4, 3, 5, 6 ]
我从documentation所了解的是 $..id
是 recursive descent operator
,它递归地检查 > id
字段。
这是我遇到的问题。我需要一个表达式,该表达式仅检查当前对象中的 id
并避免在 images
数组中进行递归遍历。
所以预期的输出是-
[ 1, 2, 3 ]
我尝试JSONPath Online Evaluator来验证结果。
谢谢。
答案 0 :(得分:3)
根据 jsonpath 的文档,它们包括 ..作为递归后代运算符; JSONPath从E4X借用此语法
$ .. *用于需要在JSON结构的所有成员中进行搜索的情况。
因此,如果要限制对子项的过滤器,则需要使用$。*。 Here are the syntax
您想要的代码是:-
const fs = require('fs');
var jp = require('jsonpath');
let rawdata = fs.readFileSync('data.json');
let data = JSON.parse(rawdata);
var id = jp.query(data,'$.*.id');
console.log(id);
输出为 [1,2,3]
答案 1 :(得分:1)
您可以使用*
运算符,将运算符限制在所需的级别。
要使其执行您想要的事情,您将使用:
$.*.id
这将为您提供以下输出:
[
1,
2,
3
]
但是,假设您要使用image
特定的id
:
$.*.images.*.id
这将为您提供以下输出:
[
1,
2,
3,
4,
5,
6
]