【问题标题】:Building objects with jq用 jq 构建对象
【发布时间】:2017-05-22 05:46:39
【问题描述】:

使用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"

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

【问题讨论】:

    标签: json object jq


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2019-05-13
      • 1970-01-01
      • 2021-01-14
      • 1970-01-01
      • 2021-02-12
      • 1970-01-01
      • 2019-06-03
      • 2018-10-19
      • 2021-12-19
      相关资源
      最近更新 更多