【问题标题】:Extract Json properties from a array by value and transform to a new json structure with jq按值从数组中提取 Json 属性,并用 jq 转换为新的 json 结构
【发布时间】:2020-06-19 02:58:09
【问题描述】:

我的输入 json 看起来像这样:

[{
   "methodResponse":{
      "params":{
         "param":{
            "value":{
               "struct":{
                  "member":[
                     {
                        "name":"severity",
                        "value":{
                           "string":"Low"
                        }
                     },
                     {
                        "name":"product",
                        "value":{
                           "string":"p1"
                        }
                     }                        
                  ]
               }
            }
         }
      }
   }
}]

我想通过“名称”值过滤将每个“成员”条目提取到一个新的 json 对象中。

输出应该是这样的:

[
  {
    "severity": "Low",
    "product": "p1"
  }
]

成员项目的顺序可以改变。

我可以通过“名称”值选择值,但如果成员项目的顺序发生变化,它就不起作用。

[.[].methodResponse.params.param.value.struct.member[] | select(.name == "severity").value.string, select(.name == "product").value.string] | [{severity:.[0], product:.[1]}]

另一个问题是如果名称值没有找到成员。如果未按名称找到成员,则应为缺少的成员值打印 null-> "missingmemberName": null

  [
      {
        "severity": "Low",
        "product": "p1",
        "missingmemberName": null
      }
    ]

https://jqplay.org/s/CthSsOCQ-Y

感谢您的帮助

【问题讨论】:

  • 你能显示一个有一个没有名字的成员的对象吗?您的最后一个输出 p1 是一个有效的产品名称,它如何与 missingmemberName 一起显示?
  • 我的意思是,因为输入 json 是动态的,所以可能不存在 im 过滤的名称。例如-> 我正在搜索“select(.name == "severity").value.string”-> 但在某些情况下,整个成员项不存在,但我需要在我的 json 输出中使用 null 值的属性。

标签: json jq


【解决方案1】:

据我所知,问题第一部分的解决方案可以通过使用from_entries来解决:

.[].methodResponse.params.param.value.struct.member
| map( .value |= .string )
| [from_entries]

如果你想选择一个或多个特定的产品,上面的修改很容易。

问题的第二部分对我来说不是太清楚,但我认为一旦你理解了from_entries,你应该能够很容易地找到解决方案。

【讨论】:

  • 我不能使用 map(.value |= .string) 因为有时结构不同。例如 value.i4 而不是 value.string { "name":"id", "value":{ "i4":"12345" } }
  • 我想我明白了,ty -> .[].methodResponse.params.param.value.struct.member | [map({(.name):(.value.string//.value.i4)})|add]
猜你喜欢
  • 1970-01-01
  • 2022-10-08
  • 1970-01-01
  • 2017-03-15
  • 2018-01-09
  • 1970-01-01
  • 2022-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多