如何使用JMESPath根据params中bar的text值筛选记录?
筛选符合特定params条件的record条目
现有代码通过JMESPath表达式[].record从foobar.json中获取全部记录,需要修改表达式,仅保留满足以下条件的record:
- 该record的
params数组中存在条目 - 条目
name值为bar - 条目
text值(转为数字后)≥13
示例数据(foobar.json)
[ { "record": { "name": "foobar1", "params": [ {"name": "foo", "text": "4"}, {"name": "bar", "text": "12"} ] } }, { "record": { "name": "foobar2", "params": [ {"name": "foo", "text": "4"}, {"name": "bar", "text": "16"} ] } } ]
修改后的Python代码
import json import jmespath with open('foobar.json', 'r') as fp: data = json.load(fp) # 核心筛选表达式 expr = '[?record.params[?name==`bar` && to_number(text)>=13]].record' records = jmespath.search(expr, data) print(records)
表达式逻辑说明
[?...]:数组过滤语法,仅保留满足内部条件的元素record.params[?name==bar&& to_number(text)>=13]:检查当前元素的params数组中是否存在符合要求的子项:name==bar``:精准匹配name为bar的params条目to_number(text)>=13:将text字符串转为数字后做数值比较(原数据中text是字符串类型,直接比较会导致逻辑错误)
.record:最终提取符合条件的record对象
运行结果
返回仅包含foobar2的目标记录:
[{'name': 'foobar2', 'params': [{'name': 'foo', 'text': '4'}, {'name': 'bar', 'text': '16'}]}]
内容的提问来源于stack exchange,提问作者Marc
相关产品推荐
相关产品推荐

