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

使用jq基于父级键值条件修改JSON指定字符串字段

需求与解决方案

原始JSON结构

{"misc": {"color": "blue","id": "yyyy-12345","birthdate": "2020-12-25","tools": [{"type": "power","name": "hammer"},{"type": "manual","name": "grinder"}]},"people": [{"name": "bob","profession": "analyst","clients": [{"name": "alice","instance": "3","stringA": "prefix1/suffix-stuff"},{"name": "richard","instance": "2","stringA": "prefix1/suffix-stuff-lkasjdlflsd","stringB": "prefix2/suffix-stuff-lllaksjllsdkf","stringC": "prefix2/suffix-stuff-jhfhklasldj"},{"name": "melanie","instance": "0","stringA": "prefix1/suffix-stuff-lkalalajskljlklj","stringB": "prefix2/suffix-stuff-aljksdljsd"}]},{"name": "sarah","profession": "developer","clients": [{"name": "george","instance": "0","stringA": "prefix1/suffix-stuff-xx-klasjdlk","stringB": "prefix2/suffix-stuff-yy-lkajsldf","stringC": "prefix3/suffix-stuff-lkklkl-lkasjdl"},{"name": "anna","instance": "4","stringA": "prefix1/suffix-stuff-aa-lkadslkjjj","stringB": "prefix3/suffix-stuff-bb-lkasdjfl","stringC": "prefix2/suffix-stuff-cc-lkasjdf"},{"name": "michael","instance": "0","stringA": "prefix1/suffix-stuff-ttlkajlksdfsd","stringB": "prefix2/suffix-stuff-rrklajsdlf","stringC": "prefix3/suffix-stuff-lkljlkjxx"}]}]}

修改需求

仅修改people节点中name为指定值(如"bob")的条目下,instance不等于"0"的clients节点中的stringA和stringB字段值:

  • 替换字段值中的前缀部分为传入的新前缀(如"newprefix")
  • 保留JSON其他所有内容不变

解决方案:jq命令

使用以下jq命令,通过--arg传入目标用户名和新前缀:

jq --arg target_name "bob" --arg new_prefix "newprefix" '
  .people |= map(
    if .name == $target_name then
      .clients |= map(
        if .instance != "0" then
          (.stringA // empty) |= ($new_prefix + (. | split("/")[1:] | join("/")))
          | (.stringB // empty) |= ($new_prefix + (. | split("/")[1:] | join("/")))
        else . end
      )
    else . end
  )
' input.json

命令逻辑解释

  1. 定位目标用户:遍历people数组,匹配name等于$target_name的条目
  2. 筛选目标客户端:在该用户的clients数组中,仅处理instance不等于"0"的条目
  3. 修改字段值:对stringA和stringB字段,保留原后缀(/之后的内容),替换前缀为$new_prefix
    • (.stringA // empty)确保仅当字段存在时才执行修改,避免无此字段时报错
    • split("/")[1:]截取原字段中/之后的所有部分,再用join("/")拼接后与新前缀组合

修改后的结果

{"misc": {"color": "blue","id": "yyyy-12345","birthdate": "2020-12-25","tools": [{"type": "power","name": "hammer"},{"type": "manual","name": "grinder"}]},"people": [{"name": "bob","profession": "analyst","clients": [{"name": "alice","instance": "3","stringA": "newprefix/suffix-stuff"},{"name": "richard","instance": "2","stringA": "newprefix/suffix-stuff-lkasjdlflsd","stringB": "newprefix/suffix-stuff-lllaksjllsdkf","stringC": "prefix2/suffix-stuff-jhfhklasldj"},{"name": "melanie","instance": "0","stringA": "prefix1/suffix-stuff-lkalalajskljlklj","stringB": "prefix2/suffix-stuff-aljksdljsd"}]},{"name": "sarah","profession": "developer","clients": [{"name": "george","instance": "0","stringA": "prefix1/suffix-stuff-xx-klasjdlk","stringB": "prefix2/suffix-stuff-yy-lkajsldf","stringC": "prefix3/suffix-stuff-lkklkl-lkasjdl"},{"name": "anna","instance": "4","stringA": "prefix1/suffix-stuff-aa-lkadslkjjj","stringB": "prefix3/suffix-stuff-bb-lkasdjfl","stringC": "prefix2/suffix-stuff-cc-lkasjdf"},{"name": "michael","instance": "0","stringA": "prefix1/suffix-stuff-ttlkajlksdfsd","stringB": "prefix2/suffix-stuff-rrklajsdlf","stringC": "prefix3/suffix-stuff-lkljlkjxx"}]}]}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 18:07:20