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

nor*_*teo 15 json jsonpath node.js

我使用的NodeJSjsonpath.我有这个json结构:

{
  things:{
    books: [
      {name: "book1"},
      {name: "book2"},
      {name: "book3"},
      {name: "book4"},
    ],
    movies: [
      {name: "movie1"},
      {name: "movie2"},
      {name: "movie3"},
      {name: "movie4"},
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

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

["books","movies"]
Run Code Online (Sandbox Code Playgroud)

现在,我这样做:

Object.keys(jsonpath.eval(jsonStructure,"$.things").pop());
Run Code Online (Sandbox Code Playgroud)

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

小智 6

jsonPath 有新的更新 jsonpath-plus jsonpath-plus 在原始规范的基础上进行了扩展,添加了一些额外的运算符,并明确了原始规范中没有说明的一些行为。

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

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


Ret*_*sam 3

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

Object.keys(jsonpath.eval(jsonStructure,"$.things").pop());
Run Code Online (Sandbox Code Playgroud)

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

jsonpath.eval(jsonStructure,"$.things").pop() === jsonStructure.things //true
Run Code Online (Sandbox Code Playgroud)