유닉스 커맨드 라인 JSON 파서? [닫은]


128

파이프 라인에서 JSON 응답의 값을 검사하는 데 사용할 수있는 유닉스 (향기 선택) JSON 파서를 추천 할 수 있습니까?


pythonpy ( github.com/russell91/pythonpy ) 를 사용하고 싶습니다 : cat a.json | 평 --ji -x 'x.attr'
RussellStewart



1
람다 의 카레 API와 LiveScript 간결한 구문을 사용 하는 새로운 도구 인 ramda-cli가 있습니다. json을 입력 및 작성 기능으로 사용하도록 빌드되었습니다. npm install -g ramda-cli
Ehvince

답변:


18

Perl 코어에 내장 된 모듈을 사용하여이 명령 행 구문 분석기 (원하는 경우 bash 별명에 넣을 수 있음)를 사용할 수 있습니다.

perl -MData::Dumper -MJSON::PP=from_json -ne'print Dumper(from_json($_))'

1
나는 이것의 결과에 혼란스러워한다. 출력에는 키와 값 사이에 팻 화살표 (=>)가 포함됩니다. 이것은 JSON이 아닙니다.
랜던 쿤

7
@landon : 아니요, 입력은 JSON이고 출력은 기본 Perl 데이터 구조이므로 필요한 경우 추가 조작을 계속할 수 있습니다. 이 단일 라이너의 요점은 훨씬 더 읽기 쉬운 데이터를 생성한다는 것입니다.
Ether

1
JSON 출력을 원한다면이 Perl one-liner를 사용할 수 있습니다.perl -e "use JSON; print to_json( decode_json(<>), { pretty => 1 } )"
Georgy Vladimirov

232

내가 선호하는 python -m json.tool기본 당 대부분의 * nix에서 스크립트 운영 체제에서 기본적 당 사용할 수 보인다.

$ echo '{"foo":1, "bar":2}' | python -m json.tool
{
    "bar": 2, 
    "foo": 1
}

그러나 이것은 모든 키를 알파벳순으로 정렬하므로 정렬되지 않은 HashMaps를 사용하는 일부 언어로 json이 생성 된 경우 또는 좋은 것일 수 있습니다 ...


5
과소 평가. 주어진 JSON 파일을 유효한 JSON을 포함하는 것으로 확인하는 것이 목표라면 훌륭한 명령 줄 대안입니다.
scorpiodawg

10
이 답변은 지정된 키의 값을 검사하는 방법을 설명하지 않았습니다.
Colin Su

8
@ ColinSu 그러나 그것은 또한 원래 질문이 아닙니다. json.tooljson을 인쇄하기에 짧은 손입니다. 쉘 스크립트에서 json 데이터를 추출 / 조작 할 필요가있는 경우에는 다음과 같은 작업을 수행하는 것이 좋습니다 jq.
muhqu

@muhqu 그래, 나는 json.tool매일 열 번 사용한다 . 나는 질문에서 "introspec"의 의미를 잘못 읽은 것 같습니다. 지적 해 주셔서 감사합니다.
Colin Su

1
IMMO 이것은 파이썬의 json.tool두 가지 일, 즉 validate와 pretty-print json을 수행 하기 때문에 잘못된 대답 입니다. json의 값을 검사하지 않습니다 jq.
Devy

144

휴대용 C 컴파일 도구를 찾고 있다면 :

http://stedolan.github.com/jq/

웹 사이트에서 :

jq는 JSON 데이터에 대한 sed 와 같습니다. 이를 사용하여 sed , awk , grep 및 friends가 텍스트를 사용할 수 있는 것과 동일한 방식으로 구조화 된 데이터를 슬라이스 및 필터링하고 매핑하고 변환 할 수 있습니다.

jq는 적은 노력으로 원하는 데이터 형식을 원하는 형식으로 변환 할 수 있으며 그렇게하는 프로그램은 종종 예상보다 짧고 단순합니다.

튜토리얼 : http://stedolan.github.com/jq/tutorial/
매뉴얼 : http://stedolan.github.com/jq/manual/
다운로드 : http://stedolan.github.com/jq/download/


20
여기 최고의 답변입니다. 무거운 의존성, 작고 강력하며 훌륭한 문서화 및 그것을 시험해 보는 바람이 없습니다. 이것을 제안 해 주셔서 감사합니다!
FrozenCow

우분투 / 데비안에서는하실 수 있습니다 apt install jq.
Pablo A

나는 여러 달 전에 이것을 물었고 사랑하는 법을 배웠다 jq.
Jé Queue

63

커맨드 라인 JSON 조작을 위해 특별히 설계된 모듈을 만들었습니다.

https://github.com/ddopson/underscore-cli

  • FLEXIBLE -JSON 데이터 처리를위한 "스위스-아미-나이프"도구-간단한 프리티 프린터 또는 완전한 Javascript 명령 줄로 사용할 수 있습니다
  • POWERFUL -underscore.js의 모든 기능을 제공합니다 (underscore.string 포함)
  • SIMPLE은 - "펄 -pe"를 사용하여 유사한 JS 하나 라이너 쓸 간단 만든다
  • CHAINED- 여러 명령 호출을 서로 연결하여 데이터 처리 파이프 라인을 만들 수 있습니다.
  • MULTI-FORMAT- 입력 / 출력 형식에 대한 풍부한 지원-예쁜 인쇄, 엄격한 JSON 등 [출시 예정]
  • 문서화 -모든 명령에 대한 여러 예제가 포함 된 우수한 명령 줄 설명서

그것은 당신이 정말로 강력한 일을 쉽게 할 수있게합니다 :

cat earthporn.json | underscore select '.data .title'
# [ 'Fjaðrárgljúfur canyon, Iceland [OC] [683x1024]',
#   'New town, Edinburgh, Scotland [4320 x 3240]',
#   'Sunrise in Bryce Canyon, UT [1120x700] [OC]',
# ...
#   'Kariega Game Reserve, South Africa [3584x2688]',
#   'Valle de la Luna, Chile [OS] [1024x683]',
#   'Frosted trees after a snowstorm in Laax, Switzerland [OC] [1072x712]' ]

cat earthporn.json | underscore select '.data .title' | underscore count
# 25

underscore map --data '[1, 2, 3, 4]' 'value+1'
# prints: [ 2, 3, 4, 5 ]

underscore map --data '{"a": [1, 4], "b": [2, 8]}' '_.max(value)'
# [ 4, 8 ]

echo '{"foo":1, "bar":2}' | underscore map -q 'console.log("key = ", key)'
# key = foo
# key = bar

underscore pluck --data "[{name : 'moe', age : 40}, {name : 'larry', age : 50}, {name : 'curly', age : 60}]" name
# [ 'moe', 'larry', 'curly' ]

underscore keys --data '{name : "larry", age : 50}'
# [ 'name', 'age' ]

underscore reduce --data '[1, 2, 3, 4]' 'total+value'
# 10

또한 사용 가능한 최고의 "스마트 공백"JSON 포맷터 중 하나가 있습니다.

기능 요청이있는 경우이 게시물에 의견을 말하거나 github에 문제를 추가하십시오. 커뮤니티 회원이 필요로하는 기능의 우선 순위를 정하게되어 기쁩니다.


대박! 그러나 JSON 데이터에서 콘솔 명령을 실행할 수 있습니까? 예를 들어 URL 배열이있는 JSON 파일 wget마다 모든 URL이 제공됩니다.
Camilo Martin

@CamiloMartin-가장 쉬운 방법은 URL을 한 줄에 하나씩 인쇄 한 다음 xargs 또는 GNU 병렬을 통해 실행하는 것입니다.
Dave Dopson

@DaveDopson underscore중첩 된 객체와 배열이있는 중첩 된 json을 구문 분석하는 데 사용할 수 있습니까 ?
user227666

1
@ user227666-확실합니다. JSON은 여러 수준의 개체 중첩을 지원합니다. 또는 추가 JSON을 인코딩하는 문자열이있는 JSON을 의미 할 수 있습니다. 어느 것도 작동하지만 약간의 녹취가 필요합니다.
Dave Dopson

@DaveDopson 밑줄 지원은 "패턴"을 "포함한다". 특정 "키"의 경우 가능한 대소 문자 구분 값 집합 일치하는 "jq"를 시도했지만 작동하지 않습니다. 또한 여기 내 전체 사용 사례를 게시 - stackoverflow.com/questions/25463196/...
ekta을

13

체크 아웃 틱틱 .

진정한 Bash JSON 파서입니다.

#!/bin/bash
. /path/to/ticktick.sh

# File
DATA=`cat data.json`
# cURL
#DATA=`curl http://foobar3000.com/echo/request.json`

tickParse "$DATA"

echo ``pathname``
echo ``headers["user-agent"]``

쉘 수준 도구를 좋아합니다 :)
Jé Queue

12

또한이 툴킷을 처리 JSON 명령 줄 당신이 당신의 스택 Node.js를하고 NPM이 일어날 경우는.

그리고 유닉스 명령 행에서 JSON을 마사지하기위한 또 다른 "json"명령 .

그리고 다른 대안이 있습니다 :


관련 : Unix 용 JSON 입력을 구문 분석하기위한 명령 줄 도구?


우분투에서 설치하기 쉽다 : sudo apt-get install python-pip && sudo pip install jsonpipe
activout.se

@ divideandconquer.se 죄송하지만와 함께 npm을 사용하여이 도구를 설치합니다 npm install json.
gitaarik

@rednaw 불행히도 NPM 패키지 json는 이제 완전히 다른 패키지로 대체 된 것으로 보입니다.
Brad

8

Jshon 또는 JSON.sh를 언급 한 사람이 있습니까?

https://github.com/keenerd/jshon

json을 파이프하고 json 객체를 가로 지르고 현재 객체 (JSON 배열로)에 대한 경로를 인쇄 한 다음 공백없이 객체를 인쇄합니다.

http://kmkeen.com/jshon/
Jshon은 stdin에서 json 텍스트를로드하고 작업을 수행 한 다음 stdout에 마지막 작업을 표시하며 일반적인 텍스트 처리 파이프 라인의 일부로 만들어졌습니다.


OSX에서의 사용 예 : brew install jshon,cat *.json | jshon
kenorb

2

이 답변 에서 제안한대로 jsawk 를 사용해 볼 수 있습니다.

실제로이 작업을 수행하기 위해 빠른 파이썬 스크립트를 채울 수 있습니다.


1

들어 배쉬 / 파이썬 , 여기 파이썬의 주위에 기본 래퍼입니다 simplejson:

json_parser() {
    local jsonfile="my_json_file.json"
    local tc="import simplejson,sys; myjsonstr=sys.stdin.read(); "`
            `"myjson=simplejson.loads(myjsonstr);"
    # Build python print command based on $@
    local printcmd="print myjson"
    for (( argn=1; argn<=$#; argn++ )); do
        printcmd="$printcmd['${!argn}']"
    done
    local result=$(python -c "$tc $printcmd.keys()" <$jsonfile 2>/dev/null \
        || python -c "$tc $printcmd" <$jsonfile 2>/dev/null)
    # For returning space-separated values
    echo $result|sed -e "s/[]|[|,|']//g"
    #echo $result 
}

실제로 중첩 된 사전 스타일의 데이터 만 처리하지만 필요한 것에서 작동하며 json을 걷는 데 유용합니다. 아마 맛에 적응할 수 있습니다.

어쨌든, 또 다른 외부 의존성을 원치 않는 사람들을 위해 집에서 만든 것. 물론 파이썬을 제외하고.

전의. json_parser {field1} {field2}를 실행 print myjson['{field1}']['{field2}']하여 키 또는 {field2}공백으로 구분 된 값을 생성합니다 .


0

방금 큰 json 객체를 쉽게 탐색 할 수 있도록 작은 명령 줄 json 탐색기 인 jkid 를 만들었습니다. 콘솔 오버플로를 피하기 위해 객체를 "횡 방향으로"탐색 할 수 있으며 "미리보기"옵션이 있습니다.

$  echo '{"john":{"size":20, "eyes":"green"}, "bob":{"size":30, "eyes":"brown"}}' > test3.json
$  jkid . eyes test3.json 
object[.]["eyes"]
{
  "bob": "brown", 
  "john": "green"
}

jkidMac에 어떻게 설치 합니까?
user227666
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.