如何在保持所有其他对象不变的情况下使用jq修改对象内的对象?

时间:2017-03-21 21:59:48

标签: json jq

我有一个带有其他对象集合的json对象。

使用jq我需要能够修改一些对象,同时保持其他对象不变。

我一直在遇到可以获得更改的问题,但随后所有其他对象都消失了。或者我进行了更改,但它会影响其他所有对象。

以下是json的示例

{
  "AAAA": {
    "VALUES": {
      "val_1": {
        "key": "A_KEY1"
      },
      "val_2": {
        "key": "A_KEY2"
      }
    }
  },
  "BBBB": {
    "VALUES": {
      "val_a": {
        "key": "KEY1",
        "old": [ 0, 1 ]
      },
      "val_b": {
        "key": "KEY2",
        "old": [ 2, 3 ]
      }
    }
  }
}

我希望得到的是AAAA对象没有变化,但是对于BBBB.VALUES中的每个值,我想从old数组中获取第二个值并创建一个新的关键价值说"新"

{
  "AAAA": {
    "VALUES": {
      "val_1": {
        "key": "A_KEY1"
      },
      "val_2": {
        "key": "A_KEY2"
      }
    }
  },
  "BBBB": {
    "VALUES": {
      "val_a": {
        "key": "KEY1",
        "old": [ 0, 1 ],
        "new": 1
      },
      "val_b": {
        "key": "KEY2",
        "old": [ 2, 3 ],
        "new": 3
      }
    }
  }
}

保证数组长两个元素,不需要修改数组。

我尝试了很多jq的咒语,似乎无法让它发挥作用。 感谢

3 个答案:

答案 0 :(得分:0)

您可以使用[ keys[] ]来迭代BBBB.VALUES下的密钥:

jq '(.BBBB.VALUES | . [ keys[] ]) |= .+  { new: .old[1] }' data.json

答案 1 :(得分:0)

如果理解with_entries/1,可以使用易于阅读的解决方案:

.BBBB.VALUES
|= with_entries( .value.new = .value.old[1] ) )

或者更简单地说:

.BBBB.VALUES
|= with_entries( .value |= (.new = .old[1] ) )

答案 2 :(得分:0)

以下是使用 map_values

的解决方案
$ awk '{print $NF}' <<< "$s"