jq从数组中选择值

Mar*_*ing 8 json jq

我有以下带有示例值的JSON文件:

{
    "files": [{
        "fileName": "FOO",
        "md5": "blablabla"
    }, {
        "fileName": "BAR",
        "md5": "alaldlafj"
    }]
}
Run Code Online (Sandbox Code Playgroud)

现在我想要的是返回md5值,例如fileName是"FOO".为此,我在以下声明jq:

cat <file>.json | jq '.[] | select(.fileName=="FOO")' 
Run Code Online (Sandbox Code Playgroud)

但回复是: jq: error (at <stdin>:11): Cannot index array with string "fileName"

返回密钥fileName等于某个参数的md5值的正确方法是什么?

jmu*_*sch 13

回答更通用的如何从数组中选择值选择所有文件名:

cat results.json | jq '.files[] | .filename'
Run Code Online (Sandbox Code Playgroud)


Mar*_*ing 10

找到答案:

cat <file>.json | jq -r '.files[] | select(.fileName=="FOO") | .md5'
Run Code Online (Sandbox Code Playgroud)

  • 为什么要把“cat”带进去呢?你可以简单地`jq -r '.files[] | 选择(.fileName==“FOO”)| .md5' &lt;文件.json&gt;` (21认同)
  • @布伦特D。- 你是对的,你的版本更短更简单。然而,像我这样的一些人强烈喜欢以“cat”开头的严格从左到右的结构,特别是当涉及管道时。 (9认同)
  • 保持严格从左到右排序的更短、更简单的行是 `&lt;file.json jq -r '.files[] | 选择(.fileName==“FOO”)| .md5'` (3认同)

Ale*_*ger 7

或者:

cat <file>.json | jq -r '.files[] | select(.fileName=="FOO").md5'
Run Code Online (Sandbox Code Playgroud)

  • 欢迎来到 Stackoverflow!请考虑阅读[此](https://stackoverflow.com/help/how-to-answer)部分以改进您的答案。您能为您在此处发布的代码提供解释吗? (9认同)