如何使用JSONPath提取父级JSON属性名
如何使用JSONPath提取父级JSON属性名
嘿,我懂你的需求——你现在想要的不是那些被过滤内容的具体数据,而是要拿到被标记为filtered: true的属性名(就像例子里的foo),而不是它的子对象,对吧?
先说说你当前用的JSONPath表达式$.choices[*].content_filter_results[?(@.filtered==true)]的问题:它确实能定位到符合条件的子对象,但返回的是对象本身,不是它的键名。要拿到键名,得根据你使用的JSONPath实现来调整表达式,因为不同的库对JSONPath的扩展语法支持不一样:
情况1:使用Jayway JsonPath(常用的Java/JavaScript实现)
这个库支持通过entrySet()来遍历键值对,然后筛选值符合条件的键,对应的表达式是:
$.choices[*].content_filter_results.entrySet()[?(@.value.filtered == true)].key
执行这个表达式后,会直接返回你要的结果:["foo"]。
情况2:使用JSONPath Plus(增强版的JavaScript实现)
这个库支持keys()函数来获取对象的所有键,再结合筛选条件,你可以这样写:
keys($.choices[*].content_filter_results)[?($.choices[0].content_filter_results[@].filtered == true)]
或者更简洁的方式,利用父节点引用:
$..content_filter_results.*[?(@.filtered==true)]^.key()
执行后同样会返回["foo"]。
情况3:基础JSONPath实现(无扩展语法)
如果你的JSONPath工具只支持标准语法,那可能没办法直接提取键名。这时候可以先通过你原来的表达式拿到所有符合条件的子对象,然后在代码层面(比如Python、JavaScript)遍历content_filter_results的所有键,检查对应值的filtered是否为true,进而提取出目标键名。
举个JavaScript的例子:
const data = { /* 你的JSON数据 */ }; const filteredKeys = Object.keys(data.choices[0].content_filter_results) .filter(key => data.choices[0].content_filter_results[key].filtered === true); // filteredKeys 就是 ["foo"]
这样就能轻松拿到你想要的属性名啦!
备注:内容来源于stack exchange,提问作者Kel Solaar
相关产品推荐
相关产品推荐

