전에 JSON을 탐색하고 조작할 수 있는 커맨드라인 도구 jq를 소개했다. jq는 꽤 유용한 도구이지만 동시에 jq의 문법에 익숙해져야 해서 잘 쓰기가 약간 어렵기도 하다. 최근에는 좀 더 쓰기 편한 jid라는 도구도 나왔다. jq에는 기능이 많은데 쓰는 기능만 사용하다가 좀 더 잘 활용해 보려고 필요할 때 조금씩 기능을 더 찾아가면서 써보고 있다.
최근에 구글 번역 API를 사용해보고 있는데 구글 번역에서 지원하는 언어를 API로 제공하고 있다. 현재 만들고 있는 사이드 프로젝트에서 사용자가 번역하고자 하는 언어를 선택할 수 있도록 지원언어를 셀렉트박스로 만들고 싶었는데 언어가 너무 많았다.
$ curl "https://translation.googleapis.com/language/translate/v2/languages?key=YOUR_API_KEY&target=en"
{
"data": {
"languages": [
{
"language": "af",
"name": "Afrikaans"
},
{
"language": "sq",
"name": "Albanian"
},
{
"language": "am",
"name": "Amharic"
},
{
"language": "ar",
"name": "Arabic"
},
{
"language": "hy",
"name": "Armenian"
},
... 중략 ...
{
"language": "xh",
"name": "Xhosa"
},
{
"language": "yi",
"name": "Yiddish"
},
{
"language": "yo",
"name": "Yoruba"
},
{
"language": "zu",
"name": "Zulu"
}
]
}
}
이 API는 https://translation.googleapis.com/language/translate/v2/에서 제공되는데 제공하는 언어가 104개나 된다.(영어 기준) 이를 셀렉트박스로 만들기 위해 <option>
태그로 만들고 싶은데 보면서 적기에는 너무 많아서 jq를 이용해서 <option>
태그를 만들도록 했다.
$ curl "https://translation.googleapis.com/language/translate/v2/languages?key=YOUR_API_KEY&target=en" | jq -r '.data.languages[] | "<option value=\"\(.language)\">\(.name)<\/option>"'
<option value="af">Afrikaans</option>
<option value="sq">Albanian</option>
<option value="am">Amharic</option>
<option value="ar">Arabic</option>
<option value="hy">Armenian</option>
...중략...
<option value="xh">Xhosa</option>
<option value="yi">Yiddish</option>
<option value="yo">Yoruba</option>
<option value="zu">Zulu</option>
응답으로 받은 JSON에서 원하는 <option>
태그를 만들었고 이를 복사해서 사용하면 된다.
이 기능은 jq의 String interpolation)을 사용한 것이다. 실제 변환하는 부분은 다음 부분이다.
jq -r '.data.languages[] | "<option value=\"\(.language)\">\(.name)<\/option>"'
-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