다음 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
블록에 넣어야 합니다 .