jq로 JSON 응답에서 원하는 문자열 생성하기
전에 JSON을 탐색하고 조작할 수 있는 커맨드라인 도구 jq를 소개했다. jq는 꽤 유용한 도구이지만 동시에 jq의 문법에 익숙해져야 해서 잘 쓰기가 약간 어렵기도 하다. 최근에는 좀 더 쓰기 편한 jid라는 도구도 나왔다. jq에는 기능이 많은데 쓰는 기능만 사용하다가 좀 더 잘 활용해 보려고 필요할 때 조금씩 기능을 더 찾아가면서 써보고 있다.
최근에 구글 번역 API를 사용해보고 있는데 구글 번역에서 지원하는 언어를 API로 제공하고 있다. 현재 만들고 있는 사이드 프로젝트에서 사용자가 번역하고자 하는 언어를 선택할 수 있도록 지원언어를 셀렉트박스로 만들고 싶었는데 언어가 너무 많았다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
|
이 API는 https://translation.googleapis.com/language/translate/v2/에서 제공되는데 제공하는 언어가 104개나 된다.(영어 기준) 이를 셀렉트박스로 만들기 위해 <option> 태그로 만들고 싶은데 보면서 적기에는 너무 많아서 jq를 이용해서 <option> 태그를 만들도록 했다.
1 2 3 4 5 6 7 8 9 10 11 |
|
응답으로 받은 JSON에서 원하는 <option> 태그를 만들었고 이를 복사해서 사용하면 된다.
이 기능은 jq의 String interpolation)을 사용한 것이다. 실제 변환하는 부분은 다음 부분이다.
1
|
|
-r옵션을 붙이지 않으면 결괏값이 모두 큰따옴표로 묶이므로 이를 제거하기 위해서 raw 값을 받도록 한 것이다.- 뒤에 붙은 홑따옴표 내의 부분이 실제 jq가 JSON을 조작하는 부분이다.
.data.languages[]는 응답 데이터에서data밑에languages를 가져온 것이고 이 값이 배열이므로 다음 조작에서 배열로 다루기 위해[]를 붙였고 이를 파이프(|)로 연결했다.- 앞에서 받은 데이터를 문자열로 만드는 부분이
"<option value=\"\(.language)\">\(.name)<\/option>"이다. 큰따옴표 안에 있는 부분은 그냥 문자열이고 문자열 내에서 앞에서 받은 데이터를 사용할 때는\(.language)와 같은 문법을 사용한다. 그래서 이는 Google API에서 받은 값에서language는 value에 넣고name은<option>태그 안에 넣은 것이다.
배열마다 실행하므로 앞에서 본 것처럼 <option value="hy">Armenian</option>같은 최종문자열이 완성된다.
Comments