我正在尝试使用jq从cURL返回的JSON中获取值。
这是JSON cURL传递给jq(和FTR,我希望jq返回“VALUE-I-WANT”而不带引号):
[
{
"success":{
"username":"VALUE-I-WANT"
}
}
]
我最初尝试过这个:
jq ' . | .success | .username'
得到了
jq: error (at <stdin>:0): Cannot index array with string "success"
然后我尝试了一系列变种,没有运气。
随着一堆搜索网络,我发现this SE entry,并认为它可能是我的救世主(剧透,但事实并非如此)。但它让我尝试了这些:
jq -r '.[].success.username'
jq -r '.[].success'
他们没有返回错误,他们返回“null”。这可能是也可能不是改进。
有谁能告诉我这里我做错了什么?为什么这是错的?
答案 0 :(得分:3)
您需要将<{1}}的输出管道到下一个过滤器中。
jq -r '.[] | .success.username' tmp.json
答案 1 :(得分:3)
<强> TL;博士强>
# Extract .success.username from ALL array elements.
# .[] enumerates all array elements
# -r produces raw (unquoted) output
jq -r '.[].success.username' file.json
# Extract .success.username only from the 1st array element.
jq -r '.[0].success.username' file.json
您的输入是数组,因此为了访问元素,您需要.[]
,{{3} (顾名思义,它还可以枚举对象的属性):
只需. |
通过管道将输入(.
)数组作为整体发送,而数组只有数字索引,所以尝试使用.success.username
索引(访问)它失败。
因此,只需在原始尝试中将. |
替换为.[] |
,再加上-r
以获取 raw (未加引号的输出),就可以解决您的问题,如array/object-value iterator所示。
但是,chepner's helpful answer指出,至少jq 1.3
(撰写本文时的当前内容为jq 1.5
),您并不需要管道,如顶部的命令所示
因此,问题中的第二个命令应使用您的示例输入,除非您使用的是旧版本。