데이터와 함께 여러 유형의 JSON 파일을 출력하는 시스템이 있습니다.
다음 세 가지 조건을 달성하기 위해 사용할 기회가 있습니까 jq
? map()
명령과 --arg
명령 줄 옵션을 살펴보고 있는데 --argjson
막혔습니다.
첫 번째 JSON, 객체가 있고 asset
다음 키 값 쌍을 추가하고 싶습니다.
"house": true 및 "color": "주황색"
{
"name": "Paul",
"country": "USA",
"spec": {
...
"asset": {
"yard": true
},
}
}
원하는 출력:
{
"name": "Paul",
"country": "USA",
"spec": {
...
"asset": {
"house": true,
"colour": "orange",
"yard": true
},
}
}
두 번째 JSON, 객체가 없으므로 asset
객체와 다음 키 값 쌍을 추가하고 싶습니다.
"house": true 및 "color": "주황색"
{
"name": "Paul",
"country": "USA",
"spec": {
...
}
}
원하는 출력:
{
"name": "Paul",
"country": "USA",
"spec": {
...
"asset": {
"house": true,
"colour": "orange"
},
}
}
세 번째 JSON, 개체가 있지만 해당 키-값 쌍이 다음으로 설정 되어 있는지 asset
변경하고 싶습니다 .house
false
colour
orange
{
"name": "Paul",
"country": "USA",
"spec": {
...
"asset": {
"house": false,
"colour": "black"
},
}
}
원하는 출력:
{
"name": "Paul",
"country": "USA",
"spec": {
...
"asset": {
"house": true,
"colour": "orange"
},
}
}
답변1
아래 코드는 명령줄에서 색상을 문자열로 가져와 --arg
부울 값을 사용합니다 --argjson
(문자열이 아니기 때문에). 그런 다음 무조건 내부 colour
합계 house
키를 .spec.asset
지정된 값으로 설정합니다. .spec.asset
입력 문서에 없으면 작성하십시오 .
jq --arg colour orange --argjson house true '.spec.asset += $ARGS.named' input.json
$ARGS.named
in의 변수는 jq
명명된 매개변수를 키로, 주어진 매개변수를 값으로 포함하는 객체입니다. 위의 예에서 $ARGS.named
이는 다음과 같습니다.
{"colour":"orange","house":true}
+=
수정하려는 문서의 섹션 에 이를 추가하면 해당 섹션에 대해 지정된 키와 값을 추가하고 이미 존재하는 키를 덮어쓰는 효과가 있습니다.
각 입력 파일에 대해 명령을 실행합니다.
$ jq . -c file1
{"name":"Paul","country":"USA","spec":{"asset":{"yard":true}}}
$ jq --arg colour orange --argjson house true '.spec.asset += $ARGS.named' file1
{
"name": "Paul",
"country": "USA",
"spec": {
"asset": {
"yard": true,
"colour": "orange",
"house": true
}
}
}
$ jq . -c file2
{"name":"Paul","country":"USA","spec":{}}
$ jq --arg colour orange --argjson house true '.spec.asset += $ARGS.named' file2
{
"name": "Paul",
"country": "USA",
"spec": {
"asset": {
"colour": "orange",
"house": true
}
}
}
$ jq . -c file3
{"name":"Paul","country":"USA","spec":{"asset":{"house":false,"colour":"black"}}}
$ jq --arg colour orange --argjson house true '.spec.asset += $ARGS.named' file3
{
"name": "Paul",
"country": "USA",
"spec": {
"asset": {
"house": true,
"colour": "orange"
}
}
}