jq update json - key是某个键的值,value是某个其他键的值

时间:2018-03-30 15:52:46

标签: jq

  

示例 input.json


    [{
    "organizationId": "org1",
    "runtimeVersion": "3545",
    "type": "rest-api",
    "server": "test1",
    "status": "UP"
   }]

  

预期 output.json


      [{
    "organizationId": "org1",
    "runtimeVersion": "3545",
    "type": "rest-api",
    "server": "test1",
    "status": "UP",
    "test1": "UP"
  }]

输入是一个数组对象。我需要添加新密钥,这是密钥服务器的值。此新密钥的值应为密钥状态的值。

使用 jq

实现此目标的任何解决方案

2 个答案:

答案 0 :(得分:1)

简单 jq 方法:

jq '.[] |= . + {(.server):.status}' file.json

输出:

[
  {
    "organizationId": "org1",
    "runtimeVersion": "3545",
    "type": "rest-api",
    "server": "test1",
    "status": "UP",
    "test1": "UP"
  }
]

答案 1 :(得分:1)

本着Polya的“如何解决它”的精神,让我们首先观察一个事实,即要更新的对象是一个数组是一个分心,所以让我们专注于手头的任务:

  

将键值对添加到JSON对象

因此,“添加”是一个值得注意的有用词,实际上在查看jq手册时,您会发现“+”和“添加”。如果。是起始对象,然后我们可以通过写:

来实现更新
. + {(.server): .status}

.server周围的括号是必要的,因为必须评估.server。) 上面的表达式是一个过滤器,将过滤器应用于数组的每个成员的常用方法是使用map。这导致可能是最“基本”(如“亲爱的沃森”)解决问题的方法:

map(. + {(.server): .status})

另一种方法是使用“赋值语法”来添加(或修改)密钥,从而产生更短的解决方案:

map( .[.server] = .status )

也许这不亚于...... ...