如何解析以下json数组格式?我想要filewhichisdeploy
bash 或 groovy 中的文件名值
{
"filewhichisdeploy":[
{
"filename": "value"
},{
"filename": "value"
}
]
}
答案1
您可以选择所有filename
值filewhichisdisplay
jq
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
使用bash
和jq
构建names
JSON 文档中名称的数组 :
#!/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
块中。