본문 바로가기
기타

jq로 JSON 처리하기

by 초특급하품 2019. 10. 23.

api 응답으로 json을 받은 경우 쉽게 데이터를 가공할 수 있는 jq에 대해 정리해본다. 커맨드라인 명령어인 만큼 최소한의 문법만 알아도 유익하게 사용할 수 있다.

설치

$ brew install jq

 

사용법

아래와 같은 json이 있을 때 입맛에 맞게 가공해보자.

$ cat sample.json
{"data":{"name":"myname","values": [{"id": "id0","url": "url0"},{"id": "id1","url": "url1"},{"id": "id2","url": "url2"}]}}

 

파싱 하기

jq .로 jq로 전달할 json을 넘길 수 있다. 추가적인 속성이 없기 때문에 별다른 처리 없이 바로 출력을 뱉지만 기본으로 파싱하는 과정을 거쳐 불필요한 공백을 없애고 보기 좋게 출력한다.

$ cat sample.json | jq .
{
  "data": {
    "name": "myname",
    "values": [
      {
        "id": "id0",
        "url": "url0"
      },
      {
        "id": "id1",
        "url": "url1"
      },
      {
        "id": "id2",
        "url": "url2"
      }
    ]
  }
}

 

 

조회하기

jq .key로 json의 key 값을 조회할 수 있다. 연쇄적으로도 사용 가능하다. key에 예외 글자가 있는 경우는 따옴표를 붙여서도 사용할 수 있다. 다만 이렇게 하면 연쇄적인 문법은 들지 않아서 pipe를 이용해야 한다.

$ cat sample.json | jq '.data.name'
"myname"

$ cat sample.json | jq '.["data"] | .["name"]'
"myname"

 

value가 배열 이어도 문제없이 동작한다.

$ cat sample.json | jq '.data.values'
[
  {
    "id": "id0",
    "url": "url0"
  },
  {
    "id": "id1",
    "url": "url1"
  },
  {
    "id": "id2",
    "url": "url2"
  }
]

$ cat sample.json | jq '.data.values[1].id'
"id1"

 

여기서 []를 사용하면 배열의 값만 얻을 수 있다.

$ cat sample.json | jq '.data.values[]'
{
  "id": "id0",
  "url": "url0"
}
{
  "id": "id1",
  "url": "url1"
}
{
  "id": "id2",
  "url": "url2"
}

 

[]를 사용하니 이제 output이 여러 개의  json이 돼버렸다. 하지만 여러 개의 json에 대해서도 jq는 개별적으로 동작한다.

$ cat sample.json | jq '.data.values[].id'
"id0"
"id1"
"id2"

 

하나 더 배열이 아니라 json의 value를 순회할 때에도 []를 사용할 수 있다.

$ cat sample.json | jq '.data[]'
"myname"
[
  {
    "id": "id0",
    "url": "url0"
  },
  {
    "id": "id1",
    "url": "url1"
  },
  {
    "id": "id2",
    "url": "url2"
  }
]

 

jq에서 지원되는select 함수를 이용해서 배열 중에 원하는 값만 뽑을 수도 있다.

$ cat sample.json | jq '.data.values[]' | jq 'select(.id == "id1")'
{
  "id": "id1",
  "url": "url1"
}

 

심화

https://stedolan.github.io/jq/manual/ 에서 없는 게 없어 보일 만큼 거의 코딩 수준으로 여러 문법과 함수가 지원된다. json 가공할 일이 있으면 이 문서를 먼저 읽어보는 것도 좋을 것 같다.

 

 

댓글