我有一个JSON对象,看起来像这样:
[{"name":"NAME_1"},"NAME_2"]
我想输出
["NAME_1", "NAME_2"]
数组中的某些条目是带有键"name"的对象。有些只是名称的字符串。我正在尝试提取一个名称数组。使用
jq -cr '.[].name // []'
在试图索引字符串对象的.name时抛出错误。是否有一种方法来检查它是否是一个字符串,如果是,只是使用它的值而不是。name?
echo '[{"name":"NAME_1"},"NAME_2"]'
| jq '[ .[] | if (.|type) == "object" then .name else . end ]'
[
"NAME_1"
"NAME_2"
]
裁判:
- https://stedolan.github.io/jq/manual/ConditionalsandComparisons
- https://stedolan.github.io/jq/manual/
正如@ lsamuris评论的那样,一个更简单的版本
jq '[ .[] | .name? // . ]' file
- https://stedolan.github.io/jq/manual/ErrorSuppression/OptionalOperator: % 3 f
- https://stedolan.github.io/jq/manual/Alternativeoperator://
您可以使用type
函数,该函数为对象返回"object"
。
jq '.[] | if type == "object" then .name else . end' file.json
要获得数组输出,只需将整个表达式封装到[ ... ]
中。
仅对?
,map
和scalars
使用错误抑制运算符
jq 'map( .name?, scalars )'
注意,通过使用scalars
,假设除了具有name
的对象之外,所有其他对象都是NAME_*
形式的名称。如果还有其他字符串,你需要排除其中的一些,你可能需要添加一些额外的逻辑来做到这一点。例如,使用startswith(..)
与您选择的字符串。
map( .name?, select( scalars | startswith("NAME") ) )
演示仅使用显示的示例,请尝试以下jq
代码。这里使用tostream
函数从需求中获取所需值。
jq -c '[.[] | tostream | if .[1] != null then .[1] else empty end]' Input_file