【问题标题】:How to list object key names with jsonpath?如何使用 jsonpath 列出对象键名?
【发布时间】:2013-04-21 18:22:40
【问题描述】:

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

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

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

["books","movies"]

目前,我正在这样做:

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

但我不觉得它很优雅...当我只需要键名时,我不需要复制整个结构。

【问题讨论】:

  • 当你能做到Object.keys(jsonStructure.things)时为什么还要使用JSONPath?
  • 没错,这也行。但我的意思是只用 jsonpath 来做。这个想法是 jsonpath 字符串将存储在配置文件中。我希望能够只更改配置文件而不是代码来影响脚本行为。

标签: json node.js jsonpath


【解决方案1】:

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

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

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

【讨论】:

  • 太完美了!
【解决方案2】:

我认为没有比你自己更好的解决方案了:

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

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

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

【讨论】:

    【解决方案3】:

    不完全符合您的要求,但可能仍然相关。

    我们将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' ]
    .as-console-wrapper {max-height: 100% !important; top: 0}
    <script src="https://bundle.run/object-scan@13.7.1"></script>

    免责声明:我是object-scan的作者

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 这是否意味着一个新的答案?或者对另一个答案的评论?如果您想添加更多详细信息,可以edit your previous answer
      猜你喜欢
      • 2018-09-08
      • 1970-01-01
      • 2022-10-24
      • 1970-01-01
      • 1970-01-01
      • 2019-05-08
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      相关资源
      最近更新 更多