使用JQ修改嵌套的JSON数组

时间:2018-06-07 15:08:38

标签: json edit jq any

我想使用JQ修改以下JSON输入:

{
  "rows": [
    {
      "fields": [
        {
          "name": "id",
          "value": "k1"
        },
        {
          "name": "val",
          "value": "2340378b211aa3d8f2d7607cbddce883b87b191d0425736641e3d308ea329718"
        },
        {
          "name": "Encoding",
          "value": "hex"
        }
      ]
    },
    {
      "fields": [
        {
          "name": "id",
          "value": "k2"
        },
        {
          "name": "val",
          "value": "2340378b211aa3d8f2d7607cbddce883b87b191d0425736641e3d308ea329718"
        },
        {
          "name": "Encoding",
          "value": "hex"
        }
      ]
    }
  ]
}

这样,对于包含字段的行,名称为"hex"的{​​{1}}字段的"value"值仅修改为"Encoding" "oct"

我该怎么做?我可以.name=="id" and .value=="k1"使用select等字段,但我似乎无法找到“上升树”的方法来随后更新.value=="k1"字段。

不能指望输入具有固定的字段/行顺序。

1 个答案:

答案 0 :(得分:1)

使用any/2会产生一个jq过滤器,该过滤器与英语中的问题描述非常匹配:

.rows |= map( if any(.fields[]; .name=="id" and .value=="k1")
              then .fields |= map(if .name == "Encoding"
                                  then .value = "oct"
                                  else .
                                  end)
              else .
              end )

使用when / 2

如果我们使用如下定义的方便的通用功能,则可能会略微冗长且可能更清晰:

def when(filter; action): if (filter?) // null then action else . end;

我们可以简单地写一下:

.rows[] |= when( any(.fields[]; .name=="id" and .value=="k1");
                 .fields |= map( when (.name == "Encoding";
                                       .value = "oct")))

注意事项

  • 在将其更改为“oct”之前,您可能需要检查.value ==“hex”。
  • 上述过滤器可能会为每个“行”更改多个名称/值对。