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 가공할 일이 있으면 이 문서를 먼저 읽어보는 것도 좋을 것 같다.
'기타' 카테고리의 다른 글
삭제된 라인의 git commit 찾기 (0) | 2019.11.20 |
---|---|
RFC1918과 CIDR 블록 (0) | 2019.10.24 |
npm에서 package.json의 module version관리 (0) | 2019.10.15 |
가산기(Carry-lookahead Adder) 구조 (0) | 2019.10.15 |
티스토리 code highlight, mathjax 적용 (0) | 2019.10.15 |
댓글