如何使用jsonpath列出对象键名?

时间:2013-04-21 18:22:40

标签: json node.js jsonpath

我正在nodejs使用jsonpath。 我有这个json结构:

{
  things:{
    books: [
      {name: "book1"},
      {name: "book2"},
      {name: "book3"},
      {name: "book4"},
    ],
    movies: [
      {name: "movie1"},
      {name: "movie2"},
      {name: "movie3"},
      {name: "movie4"},
    ]
  }
}

我想知道jsonpath表达式返回一个具有things对象的键名的数组。那将是:

["books","movies"]

目前,我这样做:

Object.keys(jsonpath.eval(jsonStructure,"$.things").pop());

但是我发现它并不优雅......当我只需要键名时,我不需要复制整个结构。

4 个答案:

答案 0 :(得分:1)

我不相信有比你自己更好的解决方案:

Object.keys(jsonpath.eval(jsonStructure,"$.things").pop());

我认为这里的主要误解是你不必担心这个片段“得到整个结构的副本”,因为你没有复制整个结构。您已将整个对象加载到内存中,jsonpath不会创建新副本,它只返回对现有对象的引用,即:

jsonpath.eval(jsonStructure,"$.things").pop() === jsonStructure.things //true

答案 1 :(得分:1)

jsonPath具有新的更新jsonpath-plus jsonpath-plus在原始规范的基础上进行了扩展,增加了一些附加的运算符,并明确显示了原始规范没有阐明的某些行为。

^用于获取匹配项的父项 〜用于获取匹配项的属性名称(作为数组)

因此要获得正确的输出,请使用以下查询“ things。*〜”  您也可以在这里https://jsonpath.com/

答案 2 :(得分:0)

与您的要求不完全相同,但可能仍然有用。

我们将object-scan用于此类任务,因为它更适合于数据处理和分析。一旦把头缠起来,那就是(:

无论如何,如果您愿意添加其他依赖项,这是可以如何回答您的问题

const objectScan = require('object-scan');

const data = {
  things: {
    books: [
      { name: 'book1' },
      { name: 'book2' },
      { name: 'book3' },
      { name: 'book4' }
    ],
    movies: [
      { name: 'movie1' },
      { name: 'movie2' },
      { name: 'movie3' },
      { name: 'movie4' }
    ]
  }
};

console.log(objectScan(['things.*'], { rtn: 'property' })(data));
// => [ 'movies', 'books' ]

答案 3 :(得分:-1)

你给的语法错误 要获取 json 路径中的密钥,请使用 "$.*~" 前任。 输入: { "firstName": "约翰", "lastName" : "母鹿", “年龄”:26 } 输出: [ “名”, “姓”, “年龄” ]