次の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
JSONドキュメントで名前の配列を使用しbash
てjq
作成します。names
#!/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
これは、JSONドキュメントから読み取ったファイル名を配列に追加するシェルコードを作成するために使用されますnames
。問題の文書を考えると、コードは次のようになります。
names+=('value')
names+=('value')
このコードは評価を実行し、配列eval
の長さをチェックして実際に値を取得したことを確認し、ファイルから読み取ったデータを印刷します(もっと興味深いことはありません)。
答え3
文字列(null、ブール値、数値、配列、オブジェクトではありません)で、NUL(U + 0000)文字(ファイル名またはbash変数には現れませんが、他の方法で区切るために使用されます)を含まない項目をreadarray -td ''
Withに保存します。 bash arraysの助けを借りて、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
ブロックに入れる必要があります。