jq - {} 与选择之间的交互

  显示原文与译文双语对照的内容
0 0

以下是我的测试数据:


[
 {
"id":"id-1",
"tags": {
"key":"name",
"value":"name-1"
 }
 },
 {
"id":"id-2"
 }
]

我试图简化输出,显示'姓名'字段,并且总是显示,。 例如这里脚本几乎适用于:


~ $ cat testdata | jq '.[] | {id, name:. tags.value}'

{
"id":"id-1",
"name":"name-1"
}
{
"id":"id-2",
"name": null
}

当我尝试在. keys 中添加一个不存在和筛选'按键'的部分时,这里会发生什么情况:


~ $ cat testdata | jq '.[] | {id, name: (select(.tags.key =="name") |. tags.value)}'

{
"id":"id-1",
"name":"name-1"
}

我假设 {}的结尾是一个零长度 array,而不是'空'。 我应该使用什么而不是|? 我在误解什么?

时间: 原作者:

0 0

我最终使用以下方法解决了问题: [POSSIBLY_MATCHED_EXPRESSION][0],在本例中:


 cat testdata | jq '.[] | {id, name: ([select(.tags.key =="name") |. tags.value][0])}'

原作者:
0 0

如果我正确理解,如果你想只包含一个名字,只有在它存在的时候,我会这样做:


map({id} + with_entries(select(.key =="tags") |. value))

如果你不介意 null 名称:


map({id, name: with_entries(select(.key =="tags") |. value) |. name})


如果有其他"标签",这是一个更通用的解决方案,因此它不是硬编码的,只接受 name 值。

这假设任何对象值实际上是键/值对。


map(with_entries(if. value | type =="object" then. value else. end))

或者,如果 tags 是唯一的动态属性:


map(with_entries(if. key =="tags" then. value else. end))

原作者:
...