【问题标题】:modify nested JSON array with JQ使用 JQ 修改嵌套的 JSON 数组
【发布时间】:2018-06-07 15:08:37
【问题描述】:

我想使用 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"
        }
      ]
    }
  ]
}

以便将名称为"Encoding" 的"value" 字段的"hex" 值修改为"oct"仅 用于包含.name=="id" and .value=="k1" 字段的行。

我该怎么做?我可以select 一个带有.value=="k1" 等的字段,但我似乎无法找到一种方法来“上树”以随后更新"Encoding" 字段。

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

【问题讨论】:

    标签: json edit jq any


    【解决方案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”。
    • 上述过滤器可能会更改每个“行”多个名称/值对。

    【讨论】:

    • 我遇到了一个相关问题:在值生成中使用父属性选择性地更新嵌套数组中的属性。这个答案有助于朝着正确的方向发展,所以我参考它here 我回答我自己的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-29
    相关资源
    最近更新 更多