我不能让jq给我我正在寻找的价值。

时间:2017-04-21 23:15:55

标签: json bash curl jq

我正在尝试使用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”。这可能是也可能不是改进。

有谁能告诉我这里我做错了什么?为什么这是错的?

2 个答案:

答案 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),您并不需要管道,如顶部的命令所示 因此,问题中的第二个命令应使用您的示例输入,除非您使用的是旧版本。