You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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(`@`)

分步说明:

  1. 过滤有效对象:[?leagues != []] 筛选出leagues不为空的外层元素。
  2. 提取结构化数据:{ids: leagues[*].id.to_string(@), sport: leagues[0].sport} 为每个有效对象生成包含id字符串数组和统一sport的结构(因每个对象的leagues中sport一致,取第一个即可)。
  3. 拼接ID串:join('%23', ids) 将id数组用%23连接成字符串。
  4. 拼接sport后缀:先通过concat(&ttgIds=, sport) 拼接&ttgIds=和对应sport值,再用concat(@)添加结尾的@。

运行该表达式即可得到期望的输出结果。

内容的提问来源于stack exchange,提问作者sierra_papa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 17:25:04