JSON 데이터의 키 이름을 원 라이너로 쉼표로 구분하여 얻습니다.
7548 단어 SenchaArchitectExtJS센차jq
그러나 이러한 것을 키보드에서 입력하는 것은 미묘하게 귀찮습니다. 기존 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
이제 원하는 결과를 얻었습니다.
Reference
이 문제에 관하여(JSON 데이터의 키 이름을 원 라이너로 쉼표로 구분하여 얻습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/kazinoue/items/84d9d03f5501028e729d
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
cat jsondata.txt | jq -r '.(rootProperty)|keys|@csv' | sed 's/"//g'
curl -s [WebAPI] | jq -r '.(rootProperty)|keys|@csv' | sed 's/"//g'
#!/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
이제 원하는 결과를 얻었습니다.
Reference
이 문제에 관하여(JSON 데이터의 키 이름을 원 라이너로 쉼표로 구분하여 얻습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kazinoue/items/84d9d03f5501028e729d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)