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]