当对象不包含 select() 调用中的字段时如何包含对象

问题描述 投票:0回答:1

我想列出 JSON 结构中的几个字段,包括一个可选字段,该字段可能与我不想显示的其他字段一起位于数组中。我一直在使用 select() 从我想要的数组中获取一个值,但是如果我有一个没有该可选键的对象,那么它会被一起跳过。让我举个例子。数据如下:

[
{"field1":"1", "field2":"x", "Tags":[{"Key": "Name", "Value": "Name1"}, {"Key": "tag1", "Value": "tag1valuea"}]},
{"field1":"2", "field2":"y", "Tags":[{"Key": "Name", "Value": "Name2"}]},
{"field1":"3", "field2":"z", "Tags":[{"Key": "tag2", "Value": "tag2valueb"}]}
]

我想要的输出是:

1 x name1
2 y name2
3 z

我已经尝试过:

jq -r '.[] | .field1 + " " + .field2 + " " + (.Tags[] | select(.Key == "Name") .Value)'
1 x Name1
2 y Name2

但是,正如您所看到的,它会删除第三个条目,因为它没有设置为“Name”的“Key”。

然后我尝试了:

jq -r '.[] | .field1 + " " + .field2 + " " + (.Tags[] | if(.Key == "Name") then .Value else null end)'
1 x Name1
1 x
2 y Name2
3 z

您可以看到我最终得到了第一个对象的两个条目,因为它在数组中有一个我不关心的额外元素。

我已经尝试了上述两个选项的多种排列,但均无济于事。我希望有人有一种聪明的方法让 jq 不“清空”该项目(如果它没有我正在选择的键)和/或当数组中有我不想选择的项目时重复。

jq
1个回答
0
投票

我想有很多方法可以做到这一点,有些可能更好,但这里有一个

jq
过滤器可以做到这一点(使用
--raw-output
选项)。

.[]
| [.field1, .field2, (.Tags[]|select(.Key == "Name").Value)]
| join(" ")

输出示例:

1 x Name1
2 y Name2
3 z

jqplay.org 上尝试一下。

© www.soinside.com 2019 - 2024. All rights reserved.