JSONPath如何获取条件匹配结果的首个元素对应字段值
问题场景
需实现如下JSONPath查询逻辑:遍历结果列表,当列表项的t_evap字段值大于阈值881时,仅返回第一个匹配项对应的time字段值。
测试过程中遇到两类异常:
- 使用表达式
$.data[?(@.t_evap> 881)].time查询时,会返回所有匹配结果[100, 200],无法满足仅取首个匹配值的需求 - 尝试调整为
$.data[?(@.t_evap> 881)].time[0]时,表达式会错误尝试提取每个time值的首个字符,由于time为数字类型会直接触发报错
待查询的JSON结构如下:
{ "data": [ { "time": 0.00000000000000E+000, "p_evap": 3.78425000000000E+003, "t_evap": 8.80000000000000E+002, "a_evap": 2.15910676000000E-001, "p_cond": 3.78425000000000E+003, "t_cond": 8.80000000000000E+002, "a_cond": 2.15910676000000E-001 }, { "time": 1.00000000000000E+002, "p_evap": 3.86011552200429E+003, "t_evap": 8.81574884518309E+002, "a_evap": 2.15062064174011E-001, "p_cond": 3.87066987863156E+003, "t_cond": 8.80894133103899E+002, "a_cond": 2.16937100305237E-001 }, { "time": 2.00000000000000E+002, "p_evap": 3.91391364701754E+003, "t_evap": 8.82989737115102E+002, "a_evap": 2.11843836231414E-001, "p_cond": 3.95342159379127E+003, "t_cond": 8.81491251833285E+002, "a_cond": 2.20305806875845E-001 } ], "error_count": 0, "error_messages": [] }
解决方案
错误写法的核心问题是下标位置放置错误:将[0]写在.time后面,代表对筛选后得到的每一个time值单独取下标,数字类型不存在下标索引,自然会触发报错。
正确的JSONPath表达式需要先对筛选得到的匹配对象数组取第一个元素,再读取该元素的time字段,写法如下:
$.data[?(@.t_evap > 881)][0].time
该表达式的执行逻辑:
- 定位到根节点下的
data数组 - 过滤出所有
t_evap字段值大于881的数组元素,组成匹配结果数组 - 取匹配结果数组的第一个元素(下标为0)
- 读取该元素的
time字段值
针对给出的示例JSON,该表达式会直接返回预期结果100,兼容Goessner原版JSONPath、Jayway JsonPath等绝大多数主流JSONPath实现。
注:如果使用的JSONPath实现支持切片语法,也可以用
$.data[?(@.t_evap > 881)][:1].time达到同样效果,返回结果为仅包含第一个匹配值的单元素数组。
内容的提问来源于stack exchange,提问作者runfastman
相关产品推荐
相关产品推荐

