我正在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());
但是我发现它并不优雅......当我只需要键名时,我不需要复制整个结构。
答案 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 } 输出: [ “名”, “姓”, “年龄” ]