
JSON 스트림 편집기
JJ는 JSON 문서에서 값을 검색하거나 업데이트하는 빠르고 간단한 방법을 제공하는 명령 줄 유틸리티입니다. 그것은 후드 아래에서 gjson과 sjson에 의해 구동됩니다.
JSON의 관련없는 섹션을 구문 분석하고, 적용되지 않는 값을 건너 뛰고, 목표 값이 발견되거나 업데이트되는 즉시 중단되기 때문에 빠릅니다.
brew install tidwall/jj/jj
make
또는 Linux, OSX, Windows 또는 FreeBSD 용 미리 작성된 바이너리를 다운로드하십시오.
$ jj -h
usage: jj [-v value] [-purOD] [-i infile] [-o outfile] keypath
examples: jj keypath read value from stdin
or: jj -i infile keypath read value from infile
or: jj -v value keypath edit value
or: jj -v value -o outfile keypath edit value and write to outfile
options:
-v value Edit JSON key path value
-p Make json pretty, keypath is optional
-u Make json ugly, keypath is optional
-r Use raw values, otherwise types are auto-detected
-n Do not output color or extra formatting
-O Performance boost for value updates
-D Delete the value at the specified key path
-l Output array values on multiple lines
-i infile Use input file instead of stdin
-o outfile Use output file instead of stdout
keypath JSON key path (like "name.last")
JJ는 값을 찾기 위해 경로 구문을 사용합니다.
문자열 얻기 :
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj name.last
SmithJSON 블록을 얻으십시오.
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj name
{ " first " : " Tom " , " last " : " Smith " }존재하지 않는 키를 얻으십시오.
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj name.middle
null원시 문자열 값을 얻으십시오.
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj -r name.last
" Smith "인덱스별로 배열 값을 얻으십시오.
$ echo ' {"friends":["Tom","Jane","Carol"]} ' | jj friends.1
Jane 경로 접두사를 사용하여 JSON 라인에 대한 지원이 있습니다 .. 지정되면 다중 줄 문서를 배열로 취급합니다.
예를 들어:
{"name": "Gilbert", "age": 61}
{"name": "Alexa", "age": 34}
{"name": "May", "age": 57}
..# >> 4
..1 >> {"name": "Alexa", "age": 34}
..#.name >> ["Gilbert","Alexa","May"]
..#[name="May"].age >> 57
설정 값을위한 경로 구문은 값을 얻는 것보다 몇 가지 작은 차이가 있습니다.
-v value 옵션은 숫자, 부울, NULL 또는 문자열로 자동 검출됩니다. -r 옵션을 포함하여 자동 감지 및 RAW JSON을 대체 할 수 있습니다. 이는 물체, 어레이 또는 프리 마리 셔드 스트링과 같은 원시 JSON 블록에 유용합니다.
값 업데이트 :
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj -v Andy name.first
{ " name " :{ " first " : " Andy " , " last " : " Smith " }}새 가치 설정 :
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj -v 46 age
{ " age " :46, " name " :{ " first " : " Tom " , " last " : " Smith " }}새로운 중첩 값을 설정하십시오.
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj -v relax task.today
{ " task " :{ " today " : " relax " }, " name " :{ " first " : " Tom " , " last " : " Smith " }}인덱스 별 배열 값을 바꾸십시오.
$ echo ' {"friends":["Tom","Jane","Carol"]} ' | jj -v Andy friends.1
{ " friends " :[ " Tom " , " Andy " , " Carol " ]}배열 추가 :
$ echo ' {"friends":["Tom","Jane","Carol"]} ' | jj -v Andy friends.-1
{ " friends " :[ " Tom " , " Andy " , " Carol " , " Andy " ]}경계를 지나는 배열 값을 설정하십시오.
$ echo ' {"friends":["Tom","Jane","Carol"]} ' | jj -v Andy friends.5
{ " friends " :[ " Tom " , " Andy " , " Carol " ,null,null, " Andy " ]}JSON의 원시 블록을 설정하십시오.
$ echo ' {"name":"Carol"} ' | jj -r -v ' ["Tom","Andy"] ' friends
{ " friends " :[ " Tom " , " Andy " ], " name " : " Carol " }새로운 JSON 문서 시작 :
$ echo ' ' | jj -v ' Sam ' name.first
{ " name " :{ " first " : " Sam " }}값 삭제 :
$ echo ' {"age":46,"name":{"first":"Tom","last":"Smith"}} ' | jj -D age
{ " name " :{ " first " : " Tom " , " last " : " Smith " }}인덱스 별 배열 값을 삭제합니다.
$ echo ' {"friends":["Andy","Carol"]} ' | jj -D friends.0
{ " friends " :[ " Carol " ]}배열에서 마지막 항목 삭제 :
$ echo ' {"friends":["Andy","Carol"]} ' | jj -D friends.-1
{ " friends " :[ " Andy " ]} 발신자가 지정된 키패 패스의 값이 이미 존재한다고 기대할 때 -O 옵션을 사용할 수 있습니다.
이 옵션을 사용하면 작업 속도가 6 배나 빠를 수 있지만 값이 존재하지 않을 때는 20%까지 속도가 빨라질 수 있습니다.
예를 들어:
echo '{"name":{"first":"Tom","last":"Smith"}}' | jj -v Tim -O name.first
-O JJ에게 name.first 존재한다고 말하면 첫 번째가 존재하므로 먼저 빠른 트랙 작업을 시도하십시오.
-p 플래그는 출력 json을 예쁘게 만듭니다.
$ echo '{"name":{"first":"Tom","last":"Smith"}}' | jj -p name
{
"first": "Tom",
"last": "Smith"
}
또한 kyypath는 -p 플래그를 지정할 때 선택 사항입니다. 전체 JSON 문서를 예쁘게 만들 수 있습니다.
$ echo '{"name":{"first":"Tom","last":"Smith"}}' | jj -p
{
"name": {
"first": "Tom",
"last": "Smith"
}
}
-u 플래그는 신생과 공간을 쪼개서 가능한 가장 적은 문자로 JSON을 압축합니다.
JJ와 JQ를 빠르게 비교합니다. 테스트 JSON 파일은 샌프란시스코에서 206,560 개의 도시 소포의 180MB 파일입니다.
JQ 1.5 및 JJ 1.0.0을 실행하는 2015 MacBook Pro에서 테스트
JQ :
$ time cat citylots.json | jq -cM .features[10000].properties.LOT_NUM
" 091 "
real 0m5.486s
user 0m4.870s
sys 0m0.686sJJ :
$ time cat citylots.json | jj -r features.10000.properties.LOT_NUM
" 091 "
real 0m0.354s
user 0m0.161s
sys 0m0.321sJQ :
$ time cat citylots.json | jq -cM ' .features[10000].properties.LOT_NUM="12A" ' > /dev/null
real 0m13.579s
user 0m16.484s
sys 0m1.310sJJ :
$ time cat citylots.json | jj -O -v 12A features.10000.properties.LOT_NUM > /dev/null
real 0m0.431s
user 0m0.201s
sys 0m0.295s조쉬 베이커 @tidwall
JJ 소스 코드는 MIT 라이센스에 따라 사용할 수 있습니다.