질문 : Unix 도구로 JSON 구문 분석
다음과 같이 curl 요청에서 반환 된 JSON을 구문 분석하려고합니다.
curl 'http://twitter.com/users/username.json' |
sed -e 's/[{}]/''/g' |
awk -v k="text" '{n=split($0,a,","); for (i=1; i<=n; i++) print a[i]}'
위는 JSON을 필드로 분할합니다. 예를 들면 다음과 같습니다.
% ...
"geo_enabled":false
"friends_count":245
"profile_text_color":"000000"
"status":"in_reply_to_screen_name":null
"source":"web"
"truncated":false
"text":"My status"
"favorited":false
% ...
-vk=text
로 표시됨)를 어떻게 인쇄합니까?
답변
명령 줄에서 JSON을 조작 할 목적으로 특별히 설계된 여러 도구가 있으며 jq
와 같이 Awk로 수행하는 것보다 훨씬 쉽고 안정적입니다.
curl -s 'https://api.github.com/users/lambda' | jq -r '.name'
json
모듈을 사용하는 Python과 같이 시스템에 이미 설치되었을 가능성이있는 도구를 사용하여이 작업을 수행 할 수 있으므로 적절한 JSON 파서의 이점을 계속 누리면서 추가 종속성을 피할 수 있습니다. 다음은 원래 JSON을 인코딩해야하며 대부분의 최신 터미널에서도 사용하는 UTF-8을 사용한다고 가정합니다.
파이썬 3 :
curl -s 'https://api.github.com/users/lambda' | \
python3 -c "import sys, json; print(json.load(sys.stdin)['name'])"
파이썬 2 :
export PYTHONIOENCODING=utf8
curl -s 'https://api.github.com/users/lambda' | \
python2 -c "import sys, json; print json.load(sys.stdin)['name']"
자주 묻는 질문
왜 순수한 해결책이 아닌거죠?
표준 POSIX / 단일 Unix 사양 쉘 은 시퀀스 (목록 또는 배열) 또는 연관 배열 (일부 다른 언어로 해시 테이블, 맵, 딕셔너리 또는 객체라고도 함)을 나타내는 기능을 포함하지 않는 매우 제한된 언어입니다. 이로 인해 휴대용 쉘 스크립트에서 JSON 구문 분석 결과를 나타내는 것이 다소 까다로워집니다. 이를 수행하는 다소 해키적인 방법이 있지만 키 또는 값에 특정 특수 문자가 포함 된 경우 많은 방법이 손상 될 수 있습니다.
Bash 4 이상, zsh 및 ksh는 배열 및 연관 배열을 지원하지만 이러한 셸은 보편적으로 사용할 수 없습니다 (macOS는 GPLv2에서 GPLv3 로의 변경으로 인해 Bash 3에서 Bash 업데이트를 중단했지만 많은 Linux 시스템에는 zsh는 즉시 설치됨). Bash 4 또는 zsh에서 작동하는 스크립트를 작성할 수 있습니다.이 중 하나는 요즘 대부분의 macOS, Linux 및 BSD 시스템에서 사용할 수 있지만 이러한 경우에 작동하는 shebang 라인을 작성하는 것은 어려울 것입니다. 다국어 스크립트.
마지막으로, 쉘에 완전한 JSON 파서를 작성하는 것은 jq 또는 Python과 같은 기존 종속성을 대신 사용할 수있을만큼 충분히 중요한 종속성입니다. 좋은 구현을 수행하기 위해 한 줄이나 작은 5 줄 스 니펫이 될 수는 없습니다.
왜 awk, sed, grep를 사용하지 않는가?
이러한 도구를 사용하여 한 줄에 하나의 키와 같이 알려진 형태와 형식이 알려진 JSON에서 빠른 추출을 수행 할 수 있습니다. 다른 답변에는 이에 대한 몇 가지 제안 예가 있습니다.
그러나 이러한 도구는 라인 기반 또는 레코드 기반 형식을 위해 설계되었습니다. 가능한 이스케이프 문자를 사용하여 일치하는 구분 기호를 반복적으로 구문 분석하도록 설계되지 않았습니다.
따라서 awk / sed / grep을 사용하는 이러한 빠르고 더러운 솔루션은 취약 할 수 있으며 공백을 축소하거나 JSON 객체에 중첩 수준을 추가하거나 내부에 이스케이프 된 따옴표를 추가하는 등 입력 형식의 일부 측면이 변경되면 중단 될 수 있습니다. 문자열. 중단없이 모든 JSON 입력을 처리 할 수있을만큼 강력한 솔루션은 상당히 크고 복잡하므로 jq
또는 Python에 다른 종속성을 추가하는 것과 크게 다르지 않습니다.
이전에는 쉘 스크립트의 잘못된 입력 구문 분석으로 인해 삭제되는 대량의 고객 데이터를 처리해야했기 때문에 이런 방식으로 취약 할 수있는 빠르고 더러운 방법을 권장하지 않습니다. 일회성 처리를 수행하는 경우 제안에 대한 다른 답변을 참조하십시오.하지만 기존의 테스트 된 JSON 파서를 사용하는 것이 좋습니다.
기록 참고 사항
이 답변은 원래 jsawk를 jq
보다 사용하기가 조금 더 번거롭고 Python 인터프리터보다 덜 일반적으로 설치되는 독립 실행 형 JavaScript 인터프리터에 따라 달라 지므로 위의 답변이 바람직 할 것입니다.
curl -s 'https://api.github.com/users/lambda' | jsawk -a 'return this.name'
이 답변은 원래 질문의 Twitter API를 사용했지만 해당 API가 더 이상 작동하지 않아 테스트를 위해 예제를 복사하기 어렵고 새 Twitter API에는 API 키가 필요하므로 GitHub API를 사용하도록 전환했습니다. API 키없이 쉽게 사용할 수 있습니다. 원래 질문에 대한 첫 번째 대답은 다음과 같습니다.
curl 'http://twitter.com/users/username.json' | jq -r '.text'
출처 : https://stackoverflow.com/questions/1955505/parsing-json-with-unix-tools
'개발관련 > other' 카테고리의 다른 글
json.net을 사용하여 null 인 경우 클래스의 속성을 무시하는 방법 (0) | 2021.08.27 |
---|---|
node.js에서 Base64 인코딩을 수행하는 방법 (0) | 2021.08.26 |
Kotlin 삼항 조건부 연산자 (0) | 2021.08.25 |
Facebook Flux보다 Redux를 사용하는 이유 (0) | 2021.08.25 |
C #에서 선택적 매개 변수를 사용하는 방법 (0) | 2021.08.13 |