用jq构建对象

时间:2017-05-22 05:46:39

标签: json object jq

使用jq我希望转换格式数据:

{
  "key": "something-else",
  "value": {
    "value": "bloop",
    "isEncrypted": false
  }
}
{
  "key": "something",
  "value": {
    "value": "blah",
    "isEncrypted": false
  }
}

格式:

{
  something: "blah",
  something-else: "bloop"
}

过滤掉加密值'一路上。我怎样才能做到这一点?我已经达到了以下目的:

.parameters | to_entries[] | select (.value.isEncrypted == false) | .key + ": " + .value.value

产生:

"something-else: bloop"
"something: blah"

关闭,但还没有。我怀疑它有一些聪明的功能。

1 个答案:

答案 0 :(得分:1)

给出示例输入,这是一个简单的解决方案,假设对象流可用作数组。 (如果将JSON对象作为jq的输入给出,则可以使用jq -s来完成,或者在您的情况下,按照您的示例,只需使用.parameters | to_entries)。

map( select(.value.isEncrypted == false) | {(.key): .value.value } )
| add

这会生成JSON对象:

{
  "something-else": "bloop",
  "something": "blah"
}

这里的主要想法是:

  • 对象构造的语法:{( KEYNAME ): VALUE}
  • add

了解其工作原理的一种方法是首先运行过滤器的第一部分(map(...))。

使用keys_unsorted

如果您想避免to_entries的开销,您可能需要考虑以下方法,该方法背负了您对.parameters的隐含描述:

.parameters
| [ keys_unsorted[] as $k
  | if .[$k].isEncrypted == false 
    then { ($k) : .[$k].value } else empty end ]
| add