【问题标题】:JQ combine array of json maps based on keysJQ根据键组合json映射数组
【发布时间】:2021-06-24 08:53:46
【问题描述】:

我的 json 如下所示

[
  {
    "100": "ONE",
    "200": "TWO"
  },
  {
    "100": "1",
    "200": "2"
  }
]

我期待以下输出

{
  "1": "ONE",
  "2": "TWO"
} 

我在这里找到的答案很少,但都有静态键,但在我的情况下,键是动态的

另一个例子

{
  "apiVersion": "v1",
  "data": {
    "bac6f56f-101c-26da-edfa-c08e6622a337": "1"
  },
  "kind": "ConfigMap",
  "metadata": {
    "annotations": {
      "bac6f56f-101c-26da-edfa-c08e6622a337": "restart"
    },
    "creationTimestamp": "2020-06-25T14:53:06Z",
    "uid": "7b1dfc3a-1357-400e-b750-a1ff98a204b9"
  }
} 

预期的输出是

{"restart":"1"}

【问题讨论】:

  • 键总是排序的吗?
  • 不,那只是个例子
  • 以上的预期输出是什么?
  • @Inian 添加了另一个示例,它是 kubectl get configmap 的输出
  • @Inian {"restart":"1"}

标签: json key jq


【解决方案1】:

这是一种方法:

. as [$V, $K]
| reduce ($K | keys_unsorted)[] as $k ({};
  . + {($K[$k]): $V[$k]}
)

这会遍历第二个对象的键,检索与两个对象中每个键关联的值,并将它们配对到一个新对象中。并且可以通过更改来适应您的第二个示例

. as [$V, $K]

. as {data: $V, metadata: {annotations: $K}}

Online demo

【讨论】:

    【解决方案2】:

    这是第一个问题的无减少解决方案,希望也能阐明一般方法:

    .[0] as $dict
    | .[1]
    | with_entries( {value: $dict[.key], key: (.value|tostring) } )
    

    第二个问题的解决方案

    使用上述方法,我们只需要调整前两行:

    .data as $dict
    | .metadata.annotations
    | with_entries( {value: $dict[.key], key: (.value|tostring) } )
    

    【讨论】:

    • 如果我只想要一个管道分隔的字符串作为第二个问题的输出,如restart|1,你将如何重写它。有可能吗?
    • 是的,当然。一种方法是创建适当的数组,然后使用join("|")
    • 我将它传送到您的代码 | keys[] as $k | "\($k)|\(.[$k])" 并且它有效
    • 有一种方式,通常还有另一种方式:-)
    • 你会如何写你的方式create the appropriate array(s) and then use join("|")
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    • 1970-01-01
    • 2020-03-18
    • 1970-01-01
    相关资源
    最近更新 更多