JSON 데이터의 키 이름을 원 라이너로 쉼표로 구분하여 얻습니다.

Sencha Architect에서 Ext JS Model을 설정할 때 사용할 쉼표로 구분 된 데이터의 필드 이름을 지정하는 것이 유용합니다.



그러나 이러한 것을 키보드에서 입력하는 것은 미묘하게 귀찮습니다. 기존 JSON 데이터에서 복사하면 손 입력의 번거로움은 줄일 수 있지만, 항목수가 많은 경우 복사 하는 것도 의외로 귀찮습니다.

그래서 기존 JSON 데이터의 키 이름을 쉼표로 구분하여 얻는 원라이너를 작성해 보겠습니다.

원라이너의 예



jq를 사용하면 키만 쉽게 꺼낼 수 있기 때문에 그것을 조금 가공하는 것입니다.

JSON 데이터 파일을 사용한다면 이렇습니다.
cat jsondata.txt | jq -r '.(rootProperty)|keys|@csv' | sed 's/"//g'

라이브 데이터로 만드는 경우는 curl 를 사용하면 좋다고 생각합니다.
curl -s [WebAPI] | jq -r '.(rootProperty)|keys|@csv' | sed 's/"//g'

(rootProperty) 부분은 취급하는 데이터에 맞추어 적절히 변경해 주세요. rootProperty 가 없는 경우는 단순히 . 그냥 좋을 것입니다.

JSON 데이터가 단순한 배열이 아니라 구조가 섞여있는 경우에도 참조하고 싶은 부분을 정확하게 지정하면 키를 얻을 수 있습니다.

덧붙여 원 라이너의 마지막에 sed로 "를 지우는 조작이 자신적으로는 이마이치라고 생각하고 있으므로, jq만으로"를 떨어뜨리는 방법을 아는 분이 계시면 코멘트란에서 팔로우해 주시면 대단히 고맙습니다.

2019/02/08 추가

원 라이너만으로도 좋지만 문득 눈치채면 jq나 sed의 파라미터를 잊어 버리므로, 쉘 스크립트로 하기로 했습니다.

그리고 모처럼이므로 generateModelField.sh "ファイル名またはURL" "参照したい要素" 와 같이 실행할 수 있도록 구현해 보겠습니다.

generateModelField.sh
#!/bin/bash

file=$1
jsonpath=$2

(
    if [ -e ${file} ]; then
        cat ${file}
    fi

    if [ ${file:0:4} == "http" ]; then
        curl -s ${file}
    fi
) | jq -r "${jsonpath}|keys|@csv" | sed 's/"//g'

위의 결과에 이르는 절차



우선, 환경은 Ubuntu(WSL 포함), macOS 를 상정하고 있습니다.

사용하는 명령은 curl, jq, sed 입니다만, jq 는 미인스톨의 케이스가 많다고 생각하므로, 이 기회에 인스톨 해 주세요. brew, apt로 설치할 수 있어야합니다.

또, 여기로부터의 순서에서는 주로 jq 를 사용하고 있습니다만, jq 자체의 세세한 사용법은 해설하지 않으므로, 이번 처음으로 jq 를 아는 분은 구구 해 보세요.

우선, 다음과 같이 실행하면(자), API 의 실행 결과를 jq 로 정형된 형태로 취득할 수 있습니다.
$ curl -s http://apis.is/earthquake/is | jq '.' | more
{
  "results": [
    {
      "timestamp": "2017-10-13T12:07:24.000Z",
      "latitude": 63.976,
      "longitude": -21.949,
      "depth": 1.1,
      "size": 0.6,
      "quality": 58.73,
      "humanReadableLocation": "6,1 km SV af Helgafelli"
    },
    .
    .
    .

이 데이터는 rootProperty 가 "results"이므로, jq 의 파라미터를 이하와 같이 재기록하면, JSON 배열의 0번째만을 꺼낼 수 있습니다.
$ curl -s http://apis.is/earthquake/is | jq '.results[0]'
{
  "timestamp": "2017-10-13T12:07:24.000Z",
  "latitude": 63.976,
  "longitude": -21.949,
  "depth": 1.1,
  "size": 0.6,
  "quality": 58.73,
  "humanReadableLocation": "6,1 km SV af Helgafelli"
}

게다가 jq 의 파라미터를 다음과 같이 바꾸어 보면, key 만이 빼낼 수 있었습니다.
$ curl -s http://apis.is/earthquake/is | jq '.results[0]|keys'
[
  "depth",
  "humanReadableLocation",
  "latitude",
  "longitude",
  "quality",
  "size",
  "timestamp"
]

이 결과를 csv로 변환하면 key를 쉼표로 구분하여 얻을 수 있지만 이것만으로는 작동하지 않습니다.
$ curl -s http://apis.is/earthquake/is | jq '.results[0]|keys|@csv'
"\"depth\",\"humanReadableLocation\",\"latitude\",\"longitude\",\"quality\",\"size\",\"timestamp\""

그래서 jq의 커맨드 라인 파라미터에 -r을 추가해 보겠습니다.

$ curl -s http://apis.is/earthquake/is | jq -r '.results[0]|keys|@csv'
"depth","humanReadableLocation","latitude","longitude","quality","size","timestamp

이것으로 대체하고 싶은 결과가 되었습니다만, "가 방해이므로 지웁시다. 이번은 jq 의 출력 결과로부터 일괄로 "를 떨어뜨리기 위해서 sed 로 필터 해 보겠습니다.
$ curl -s http://apis.is/earthquake/is | jq -r '.results[0]|keys|@csv' | sed 's/"//g'
depth,humanReadableLocation,latitude,longitude,quality,size,timestamp

이제 원하는 결과를 얻었습니다.

좋은 웹페이지 즐겨찾기