次のjson配列型をどのように解析できますか? bashまたはgroovyでこのファイル名の値が必要ですか?

次のjson配列型をどのように解析できますか? bashまたはgroovyでこのファイル名の値が必要ですか?

次のjson配列型を解析する方法は?filewhichisdeployBashまたはGroovyでファイル名の値が必要です。

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

答え1

filenameすべての値を選択できます。filewhichisdisplayjq

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ドキュメントで名前の配列を使用しbashjq作成します。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ブロックに入れる必要があります。

関連情報