使用JMESPath提取并拼接嵌套值问题求助
问题描述
给定输入数据:
data = [{'leagues': [{'id': 2294162, 'sport': 'S'}, {'id': 8541851, 'sport': 'S'}]}, {'leagues': []}, {'leagues': [{'id': 2228013, 'sport': 'B'}]}]
期望生成输出:
result = ['2294162%238541851&ttgIds=S@', '2228013&ttgIds=B@']
尝试的JMESPath表达式已接近目标,但无法正确提取并拼接sport值:
jmespath.search("[?not_null(@.leagues)].leagues[*].id.to_string(@) | [*].join(', ', @).join('', [[@],['&ttgIds=', '@']][]).replace(@, ', ', '%23')", data=data)
输出结果:
['2294162%238541851&ttgIds=@', '2228013&ttgIds=@']
尝试使用let语法后输出为空:
jmespath.search("[?not_null(@.leagues)].leagues[*].let $sport_id = sport in id.to_string(@) | [*].join(', ', @).join('', [[@],['&ttgIds=', $sport_id, '@']][]).replace(@, ', ', '%23')", data=data)
输出结果:
[[], []]
解决方法
问题出在你没有正确关联每个分组的sport值,且let的作用域使用错误。结合数据特征(每个有效外层对象的leagues中sport值统一),可以按以下思路处理:
使用以下JMESPath表达式:
[?leagues != `[]`].{ids: leagues[*].id.to_string(@), sport: leagues[0].sport} | [*] .join('%23', ids) .concat(`&ttgIds=`, sport) .concat(`@`)
分步说明:
- 过滤有效对象:
[?leagues !=[]]筛选出leagues不为空的外层元素。 - 提取结构化数据:
{ids: leagues[*].id.to_string(@), sport: leagues[0].sport}为每个有效对象生成包含id字符串数组和统一sport的结构(因每个对象的leagues中sport一致,取第一个即可)。 - 拼接ID串:
join('%23', ids)将id数组用%23连接成字符串。 - 拼接sport后缀:先通过
concat(&ttgIds=, sport)拼接&ttgIds=和对应sport值,再用concat(@)添加结尾的@。
运行该表达式即可得到期望的输出结果。
内容的提问来源于stack exchange,提问作者sierra_papa
相关产品推荐
相关产品推荐

