Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 根据子阵列信息使用JSONPath筛选阵列_Javascript_Json_Xpath_Jsonpath - Fatal编程技术网

Javascript 根据子阵列信息使用JSONPath筛选阵列

Javascript 根据子阵列信息使用JSONPath筛选阵列,javascript,json,xpath,jsonpath,Javascript,Json,Xpath,Jsonpath,我有JSON和电影数组,如中,但有额外的演员数组和隐式类型信息(数据库、电影) 我创建了这个JSFIDLE: 我尝试过滤该数组,以查找特定演员参与的所有电影。 当我尝试这样的事情时: jsonPath(json, "$.[actors[?(@.id==2)]]") 我只和演员拍了两次戏,但没有整部电影。所以我认为问题可能在于定义根元素——但同样不起作用的是 $.*[…],$.[*][…],$[*.[…],… 我试图得到的结果是: [{ "name

我有JSON和电影数组,如中,但有额外的演员数组和隐式类型信息(数据库、电影)

我创建了这个JSFIDLE:

我尝试过滤该数组,以查找特定演员参与的所有电影。 当我尝试这样的事情时:

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)]^”,
包装:错,
结果类型:“父项”
}));

您说得对,我没有意识到多个可用实现之间存在差异。感谢您提供了备选示例。您的观点是正确的,我没有意识到多个可用实现之间存在差异。感谢您提供了其他示例。