获取jq数组中对象或字符串的值



我有一个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

要获得数组输出,只需将整个表达式封装到[ ... ]中。

仅对?,mapscalars使用错误抑制运算符

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

相关内容

  • 没有找到相关文章

最新更新