我如何解析以下 json 数组格式。我想要 bash 或 groovy 中的这个文件名值?

我如何解析以下 json 数组格式。我想要 bash 或 groovy 中的这个文件名值?

如何解析以下json数组格式?我想要filewhichisdeploybash 或 groovy 中的文件名值

{
  "filewhichisdeploy":[
    {
      "filename": "value"
    },{
      "filename": "value"
    }
  ]
}

答案1

您可以选择所有filenamefilewhichisdisplayjq

jq -r '.filewhichisdeploy[].filename' <file

例子

# Populate "file" with the sample json
cat >file <<'EOJ'
{
  "filewhichisdeploy":[
    {
      "filename": "value1"
    },{
      "filename": "value2"
    }
  ]
}
EOJ

# Pick out the key values
jq -r '.filewhichisdeploy[].filename' file
value1
value2

[]一个无界数组。您可以选择特定编号的元素,例如第一个是[0]

答案2

使用bashjq构建namesJSON 文档中名称的数组 :

#!/bin/bash

unset -v names

code=$( jq -r '.filewhichisdeploy[] | @sh "names+=(\(.filename))"' file ) || exit

eval "$code"

if [[ ${#names[@]} -eq 0 ]]; then
        echo 'No names found' >&2
        exit 1
fi

printf 'Filename to deploy: "%s"\n' "${names[@]}"

这用于jq构建 shell 代码,将从 JSON 文档读取的文件名添加到数组中names。考虑到问题中的文档,代码将是

names+=('value')
names+=('value')

这段代码是用 进行评估的eval,检查数组的长度以查看我们是否确实获得了任何值,然后打印从文件中读取的数据(缺少任何更有趣的东西)。

答案3

存储那些字符串(不是 null、布尔值、数字、数组、对象)且不包含 NUL (U+0000) 字符(不能出现在文件名或 bash 变量中,但我们否则使用它来分隔 ) 的条目readarray -td '',在 bash 数组的帮助下jq,您可以这样做(假设 bash 4.4 或更高版本):

readarray -td '' array < <(
  jq -j '.filewhichisdeploy?[].filename?|
           strings|
           select(index("\u0000")|not)|
           . + "\u0000"' file.json
)
wait "$!" || exit # abort if jq failed

它将文件名存储在数组中,就像它们是文本一样,并且采用 UTF-8 编码。如果您希望它们是区域设置编码中的文本,则可以将其通过管道传输到iconv -f UTF-8

readarray -td '' array < <(
  set -o pipefail
  jq -j '.filewhichisdeploy?[].filename?|
           strings|
           select(index("\u0000")|not)|
           . + "\u0000"' file.json |
    iconv -f UTF-8
)
wait "$!" || exit # abort if jq or iconv failed

答案4

由于这是针对 Jenkins 管道,因此有一种比迄今为止建议的方法更简单的方法:

def json = readJSON(file: 'myJsonFile.json')
def filenames = json['filewhichisdeploy'].collect { it['filename'] }

filenames将是文件名的数组。

请注意,这是针对脚本化管道的。如果您使用声明式,则需要将其放入script块中。

相关内容