Javascript 根据子阵列信息使用JSONPath筛选阵列
我有JSON和电影数组,如中,但有额外的演员数组和隐式类型信息(数据库、电影) 我创建了这个JSFIDLE: 我尝试过滤该数组,以查找特定演员参与的所有电影。 当我尝试这样的事情时:Javascript 根据子阵列信息使用JSONPath筛选阵列,javascript,json,xpath,jsonpath,Javascript,Json,Xpath,Jsonpath,我有JSON和电影数组,如中,但有额外的演员数组和隐式类型信息(数据库、电影) 我创建了这个JSFIDLE: 我尝试过滤该数组,以查找特定演员参与的所有电影。 当我尝试这样的事情时: jsonPath(json, "$.[actors[?(@.id==2)]]") 我只和演员拍了两次戏,但没有整部电影。所以我认为问题可能在于定义根元素——但同样不起作用的是 $.*[…],$.[*][…],$[*.[…],… 我试图得到的结果是: [{ "name
jsonPath(json, "$.[actors[?(@.id==2)]]")
我只和演员拍了两次戏,但没有整部电影。所以我认为问题可能在于定义根元素——但同样不起作用的是
$.*[…],$.[*][…],$[*.[…],…
我试图得到的结果是:
[{
"name": "30 Minutes or Less",
"genre": "adventure",
"director": "Ruben Fleischer",
"Facebook_like": 114,
"actors": [{
"id": 2,
"name": "Jesse Eisenberg"
}]
},
{
"name": "The Social Network",
"genre": "Biography",
"director": "David Fincher",
"Facebook_like": 0,
"actors": [{
"id": 2,
"name": "Jesse Eisenberg"
}]
}
]
好问题。您在示例中使用了Goessner的参考JSONPath实现(提出该实现的人)以及教程页面上的实时测试(页面上的下载链接似乎链接到了一个稍有不同的版本)。您提出的查询实际上不受支持,它只能部分工作。计算出的路径与递归下降相同,将所有
id
s与值2匹配:$…[?(@.id==2)]
,忽略参与者部分。您可以将其称为bug、不受支持的语法或不完整的实现。问题是,JSONPath还没有(尚未)标准化,不同的实现有不同的特性,以及或多或少微妙的路径定义
虽然这在引用(JS)实现中不起作用,但我们仍然可以找到其他可以根据请求查询数据的实现
在JavaScript世界中,我们可以使用扩展语法(这可能是目前功能最丰富的实现之一)获取父级$…[?(@.id==2)]^
,在末尾使用^
,并使用解析器标志获取父级的父级,即具有actors数组的属性
JSONPath({json: json,
path: "$..[?(@.id ==2)]^",
wrap: false,
resultType: 'parent'});
如下所示:
。作为控制台包装{最大高度:100%!重要;顶部:0;}
从导入{JSONPath}https://cdn.jsdelivr.net/npm/jsonpath-plus@4.0.0/dist/index es.js';
常量json=[{
“名称”:“变更”,
“类型”:“喜剧”,
“导演”:“大卫·多布金”,
“Facebook_like”:252,
“演员”:[{
“id”:1,
“姓名”:“Ryan Reynolds”
}]
},
{
“名称”:“人猿星球的崛起”,
“流派”:“科幻”,
“导演”:“鲁珀特·怀亚特”,
“Facebook_like”:472,
“演员”:[]
},
{
“名称”:“30分钟或更短时间”,
“类型”:“冒险”,
“导演”:“鲁本·弗莱舍”,
“Facebook_like”:114,
“演员”:[{
“id”:2,
“姓名”:“杰西·艾森伯格”
}]
},
{
“名称”:“最终目的地5”,
“类型”:“恐怖”,
“导演”:“史蒂文·奎尔”,
“Facebook_like”:241,
“演员”:[]
},
{
“名称”:“社交网络”,
“流派”:“传记”,
“导演”:“大卫·芬奇”,
“Facebook_like”:0,
“演员”:[{
“id”:2,
“姓名”:“杰西·艾森伯格”
}]
}
];
log(JSONPath({
json:json,
路径:“$..[?(@.id==2)]^”,
包装:错,
结果类型:“父项”
}));
问得好。您在示例中使用了Goessner的参考JSONPath实现(提出该实现的人)以及教程页面上的实时测试(页面上的下载链接似乎链接到了一个稍有不同的版本)。您提出的查询实际上不受支持,它只能部分工作。计算出的路径与递归下降相同,将所有id
s与值2匹配:$…[?(@.id==2)]
,忽略参与者部分。您可以将其称为bug、不受支持的语法或不完整的实现。问题是,JSONPath还没有(尚未)标准化,不同的实现有不同的特性,以及或多或少微妙的路径定义
虽然这在引用(JS)实现中不起作用,但我们仍然可以找到其他可以根据请求查询数据的实现
在JavaScript世界中,我们可以使用扩展语法(这可能是目前功能最丰富的实现之一)获取父级$…[?(@.id==2)]^
,在末尾使用^
,并使用解析器标志获取父级的父级,即具有actors数组的属性
JSONPath({json: json,
path: "$..[?(@.id ==2)]^",
wrap: false,
resultType: 'parent'});
如下所示:
。作为控制台包装{最大高度:100%!重要;顶部:0;}
从导入{JSONPath}https://cdn.jsdelivr.net/npm/jsonpath-plus@4.0.0/dist/index es.js';
常量json=[{
“名称”:“变更”,
“类型”:“喜剧”,
“导演”:“大卫·多布金”,
“Facebook_like”:252,
“演员”:[{
“id”:1,
“姓名”:“Ryan Reynolds”
}]
},
{
“名称”:“人猿星球的崛起”,
“流派”:“科幻”,
“导演”:“鲁珀特·怀亚特”,
“Facebook_like”:472,
“演员”:[]
},
{
“名称”:“30分钟或更短时间”,
“类型”:“冒险”,
“导演”:“鲁本·弗莱舍”,
“Facebook_like”:114,
“演员”:[{
“id”:2,
“姓名”:“杰西·艾森伯格”
}]
},
{
“名称”:“最终目的地5”,
“类型”:“恐怖”,
“导演”:“史蒂文·奎尔”,
“Facebook_like”:241,
“演员”:[]
},
{
“名称”:“社交网络”,
“流派”:“传记”,
“导演”:“大卫·芬奇”,
“Facebook_like”:0,
“演员”:[{
“id”:2,
“姓名”:“杰西·艾森伯格”
}]
}
];
log(JSONPath({
json:json,
路径:“$..[?(@.id==2)]^”,
包装:错,
结果类型:“父项”
}));
您说得对,我没有意识到多个可用实现之间存在差异。感谢您提供了备选示例。您的观点是正确的,我没有意识到多个可用实现之间存在差异。感谢您提供了其他示例。