JsonPath - 限制 $..id 运算符以避免遍历对象层次结构
JsonPath - Restrict $..id Operator To Avoid Traversing Object Hierarchy
我试图使用 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-路径表达式响应以下数组 -
[ 1, 1, 2, 2, 3, 4, 3, 5, 6 ]
我从 documentation 中了解到 $..id
是一个 recursive descent operator
递归检查指定数组中 id
字段的出现。
这就是我遇到问题的地方。我需要一个表达式,它只检查当前对象中的 id
并避免在 images
数组中递归遍历。
所以预期的输出是-
[ 1, 2, 3 ]
我尝试 JSONPath Online Evaluator 验证结果。
谢谢。
您可以使用 *
运算符将过滤器限制在您需要的级别。
要让它执行您想要的操作,您可以使用:
$.*.id
这将为您提供以下输出:
[
1,
2,
3
]
但是假设您想要 image
特定的 id
您将使用:
$.*.images.*.id
这将为您提供以下输出:
[
1,
2,
3,
4,
5,
6
]
根据 jsonpath 的文档,它们包括
..作为递归后代运算符;
JSONPath 从 E4X 借用了这个语法
$..* 用于在 JSON 结构的所有成员中搜索。
因此,如果您想在 child 处限制过滤器,您需要使用 $.*。
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]
我试图使用 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-路径表达式响应以下数组 -
[ 1, 1, 2, 2, 3, 4, 3, 5, 6 ]
我从 documentation 中了解到 $..id
是一个 recursive descent operator
递归检查指定数组中 id
字段的出现。
这就是我遇到问题的地方。我需要一个表达式,它只检查当前对象中的 id
并避免在 images
数组中递归遍历。
所以预期的输出是-
[ 1, 2, 3 ]
我尝试 JSONPath Online Evaluator 验证结果。
谢谢。
您可以使用 *
运算符将过滤器限制在您需要的级别。
要让它执行您想要的操作,您可以使用:
$.*.id
这将为您提供以下输出:
[
1,
2,
3
]
但是假设您想要 image
特定的 id
您将使用:
$.*.images.*.id
这将为您提供以下输出:
[
1,
2,
3,
4,
5,
6
]
根据 jsonpath 的文档,它们包括 ..作为递归后代运算符; JSONPath 从 E4X 借用了这个语法
$..* 用于在 JSON 结构的所有成员中搜索。
因此,如果您想在 child 处限制过滤器,您需要使用 $.*。 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]