如何使用JSONPath仅通过值匹配检测JSON数组中连续的tx、.、origin序列
检测JSON Tokens中连续
tx.origin语法的方法 核心思路
你需要先定位所有value为tx的token,再校验该节点后续相邻两个节点的value是否依次为.和origin,全程不需要固定索引定位,仅通过value属性匹配即可。
方案一:纯JSONPath查询(支持相对索引的JSONPath实现可用)
如果你的运行环境使用的是Jayway等支持动态索引计算的JSONPath实现,可以直接用如下查询语句:
$.tokens[?(@.value == 'tx' && $.tokens[$.indexOf(@) + 1].value == '.' && $.tokens[$.indexOf(@) + 2].value == 'origin')]
- 若查询返回非空数组,说明存在符合要求的连续
tx.origin语法 - 若返回空数组,说明不存在
注:部分简化版JSONPath实现不支持
indexOf方法,可以改用下面的代码遍历方案。
方案二:通用代码遍历实现(兼容性最高)
如果JSONPath不支持动态索引,可以先用你现有查询拿到所有tx节点,再逐一校验后续节点:
实现步骤
- 第一步:执行查询
.tokens[?(@.value == "tx")]获取所有value为tx的节点,同时记录每个节点在tokens数组中的下标 - 第二步:对每个下标
i,校验i+2不超过数组长度的前提下,tokens[i+1].value为.且tokens[i+2].value为origin - 第三步:只要有一个下标满足上述条件,即匹配成功
JavaScript示例代码
const checkTxOrigin = (jsonData) => { const tokens = jsonData.tokens; // 遍历一次数组即可完成检测,性能更高 for (let i = 0; i < tokens.length - 2; i++) { if ( tokens[i].value === 'tx' && tokens[i+1].value === '.' && tokens[i+2].value === 'origin' ) { return true; } } return false; } // 调用示例 console.log(checkTxOrigin(你的JSON对象)); // 匹配成功返回true,失败返回false
内容的提问来源于stack exchange,提问作者Rushikesh Khamkar
相关产品推荐
相关产品推荐

