JSONPath在TypeScript中使用jsonpath-plus库无法匹配取值问题
JSONPath在TypeScript中使用jsonpath-plus库无法匹配取值问题
我最近碰到个挺闹心的问题:我写了个带条件的JSONPath,本来是想根据key名称提取有效的配置项,在在线的JSONPath测试工具里跑完全没问题,能精准定位到想要的值,但换到TypeScript里用jsonpath-plus库实现的时候,居然啥都取不出来!
先给大家看看我的代码和测试场景:
我的TypeScript代码
import * as jsonpathPlus from 'jsonpath-plus'; const key = "configTwoEnabled"; const configCurrentValue = jsonpathPlus.JSONPath({ path: `$.featureSwitches[?(@.key == "${key}")]`, json: jsonResponse })[0];
示例JSON结构
{ "featureSwitches": [ { "key": "configOneEnabled", "value": true }, { "key": "configTwoEnabled", "value": false } // 其他配置项... ] }
我试过单独写$.能拿到整个JSON的所有内容,甚至写$.featureSwitches也能拿到整个数组,但一加上带条件的过滤[?(@.key == "${key}")]就返回空了,这实在搞不懂哪里出问题了!
可能的原因和解决方案
后来我查了jsonpath-plus的文档,发现不同JSONPath实现的语法细节可能有差异,尤其是字符串比较的引号处理。在线工具可能对双引号兼容性更好,但jsonpath-plus里更推荐在条件表达式里用单引号包裹字符串值,避免和模板字符串的双引号冲突。
你可以试试把路径里的双引号改成单引号:
const configCurrentValue = jsonpathPlus.JSONPath({ path: `$.featureSwitches[?(@.key == '${key}')]`, json: jsonResponse })[0];
另外还要确认几个点:
- 你的
jsonResponse结构确实和测试的一致,featureSwitches是根节点下的数组,每个元素都有小写的key字段(别不小心写成了Key或者其他大小写) - 有没有可能
key变量里的字符串和JSON里的key值有大小写或者空格差异?比如JSON里是configTwoenabled(小写d),但变量里是configTwoEnabled,这种情况也会匹配失败
如果还是不行,你可以先把拼接好的路径打印出来,看看是不是模板字符串解析后和在线工具里的路径一致:
const path = `$.featureSwitches[?(@.key == '${key}')]`; console.log(path); // 应该输出$.featureSwitches[?(@.key == 'configTwoEnabled')]
把这个打印出来的路径放到在线工具里测试,如果能拿到值,那问题就出在库的调用或者JSON数据本身了;如果也拿不到,那就是路径拼接的问题。
备注:内容来源于stack exchange,提问作者TheKeyboarder
相关产品推荐
相关产品推荐

