【问题标题】:I cannot get jq to give me the value I'm looking for.我无法让 jq 给我我正在寻找的价值。
【发布时间】:2017-09-19 02:01:23
【问题描述】:

我正在尝试使用 jq 从 cURL 返回的 JSON 中获取一个值。

这是传递给 jq 的 JSON cURL(而且,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”。这可能是也可能不是改进。

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

【问题讨论】:

  • jq -r '.[].success.username 可以在您的示例中正常工作,无论是使用 jq 1.3、jq 1.4、jq 1.5 还是当前的“主”版本。

标签: json bash curl jq


【解决方案1】:

您需要将.[] 的输出管道到下一个过滤器。

jq -r '.[] | .success.username' tmp.json

【讨论】:

    【解决方案2】:

    tl;dr

    # 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
    

    你的输入是一个数组,所以为了访问它的元素你需要.[]array/object-value iterator(作为顾名思义,它还可以枚举 objectproperties):

    只是. | 通过管道发送输入(.)数组作为一个整体,而一个数组只有数字索引,所以尝试索引(访问)它与.success.username 失败。

    因此,只需在您最初的尝试中将. | 替换为.[] |,并结合-r 以获得原始(未引用的输出),应该可以解决您的问题,如chepner's helpful answer 所示.

    但是,peak 指出,至少由于 jq 1.3(撰写本文时当前为 jq 1.5)您并不严格需要 管道,如以下命令所示顶部。
    因此,您的问题中的第二个命令应该与您的示例输入一起使用,除非您使用的是旧版本。

    【讨论】:

    • 我可能会删除我的答案;我从来没有注意到.[].success 应该工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-11
    • 2020-05-30
    • 2020-03-21
    • 2021-01-12
    • 2022-01-18
    • 1970-01-01
    相关资源
    最近更新 更多