Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

jq로 JSON 응답에서 원하는 문자열 생성하기

전에 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>같은 최종문자열이 완성된다.

2017/01/26 23:22 2017/01/26 23:22