다음 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 문서에서 이름 배열을 사용 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블록에 넣어야 합니다 .

관련 정보