jq transform JSON 结果集按参数名(参数无严格顺序)

jq transform JSON resultset by parameter names (no strict order of paramaters)

我已经尝试了很多,但都没有成功。 我在转换以下 JSON 结构时遇到问题:

JSON:

{
   "?xml":{
      "@version":"1.0",
      "@encoding":"UTF-8"

},
   "methodResponse":{
      "params":{
         "param":{
            "value":{
               "struct":{
                  "member":[
                     {
                        "name":"severity",
                        "value":{
                           "string":"Important"

}

},
                     {
                        "name":"product",
                        "value":{
                           "string":"this is a product name"

}

},
                     {
                        "name":"notes",
                        "value":{
                           "string":"Here are some notes"

}

},
                     {
                        "name":"references",
                        "value":{
                           "string":"This is a reference"

}

},
                     {
                        "name":"release",
                        "value":{
                           "i4":"1"

}

},
                     {
                        "name":"last_modified_date",
                        "value":{
                           "string":"2020-03-10 15:21:50.147896"

}

}

]

}

}

}

}

}
}

我想像在这个转换语句(已经使用一个键名)中那样按键名过滤它:

变换语句: map(.methodResponse.params.param.value.struct.member[] | select(.name == "product" ).value.string as $product| {$product})

但是当我想在一条语句中返回多个键名时,我不确定语法应该是什么样子。

我希望得到这样的结果:

[
  {
    "product": "This is a product name",
    "release": "1",
    "last_modified_date": "2020-03-09 16:39:39.0"
  }
]

我对这个话题不太熟悉,单独尝试需要很长时间... 有人可以帮忙吗?非常感谢任何帮助!

谢谢!

首先,如果您想使用 jq,您需要格式正确的 JSON 数据。 human JSON tool hjson 可能对您的输入数据有帮助。

hjson -j file

可以通过以下方式提取想要的数据:

hjson -j file | \
  jq '.methodResponse.params.param.value.struct.member |
      [map({(.name):(.value.string//.value.i4)})|add]'

它只是根据 namevalue 参数创建 ne 对象。

请注意,如果 .value.string 不存在,它将使用 .value.i4 和备用运算符 //