jq를 사용한 조건부 JSON 변환

jq를 사용한 조건부 JSON 변환

데이터와 함께 여러 유형의 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변경하고 싶습니다 .housefalsecolourorange

{
    "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.namedin의 변수는 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"
    }
  }
}

관련 정보