无法使用jq搜索和替换我的JSON

时间:2015-04-12 17:16:50

标签: json jq

我一直在努力让这个工作好几天,但我被困住了。

我有一个json数据结构,其中包含我想要更新的值,主要是使用我的json作为数据库来存储配置值。这是我的JSON:

{
  "Actions": [
    {
      "Number": 1012,
      "RollbackPoint": "xxx_1012_RollbackPoint_xxx",
      "Parameters": [
        {
          "Name": "accountType",
          "Value": "xxx_1012_accountType_xxx"
        },
        {
          "Name": "userPassword",
          "Value": "xxx_1012_userPassword_xxx"
        }
      ]
    },
    {
      "Number": 1015,
      "RollbackPoint": "xxx_1015_RollbackPoint_xxx",
      "Parameters": [
        {
          "Name": "accountType",
          "Value": "xxx_1015_accountType_xxx"
        },
        {
          "Name": "skipExport",
          "Value": "xxx_1015_skipExport_xxx"
        }
      ]
    }
  ]
}

我想要执行两次更新

  1. 将RollbackPoint更新为" 1012"其中Number = 1015
  2. 将值更新为" AWS"其中name =" accountType"在参数下,其中​​Number = 1012
  3. 到目前为止,我最接近的是使用它:

    cat json.txt | jq  '.[] | map(. + {RollbackPoint:(if (."Number") == 1015 then "1015" else .RollbackPoint end)})'
    

    但是这会删除Actions []元素,因此对我没有好处,我也不知道从哪里开始更新2 ...

    任何帮助都会非常感激,谷歌超过5个小时,我仍然不在附近。

    非常感谢 马特

2 个答案:

答案 0 :(得分:8)

您可以使用//运算符来模仿(IMHO)更好的if-else树以及各种过滤过滤器。与大型的if-else树相比,它更容易理解。

.Actions |= map(
    (select(.Number == 1015) |
        .RollbackPoint = "1012"
    ) //
    (select(.Number == 1012) |
        .Parameters |= map((select(.Name == "accountType") | .Value = "AWS") // .)
    ) //
    .
)

答案 1 :(得分:0)

这是另一个jq解决方案

 .Actions[] |= (
      if .Number == 1015 then .RollbackPoint = "1012" else . end
    | if .Number == 1012 then .Parameters[] |= (
         if .Name == "accountType" then .Value = "AWS" else . end
      ) else . end
 )