JsonPath-限制$ .. id运算符,以避免遍历对象层次结构

时间:2019-07-17 09:52:40

标签: node.js jsonpath

我试图使用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来验证结果。

谢谢。

2 个答案:

答案 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
]