
Editor JSON Stream
JJ adalah utilitas baris perintah yang menyediakan cara yang cepat dan sederhana untuk mengambil atau memperbarui nilai dari dokumen JSON. Didukung oleh Gjson dan Sjson di bawah kap.
Ini cepat karena menghindari parsing bagian JSON yang tidak relevan, melewatkan nilai -nilai yang tidak berlaku, dan dibatalkan segera setelah nilai target telah ditemukan atau diperbarui.
brew install tidwall/jj/jj
make
Atau unduh biner pra-built untuk Linux, OSX, Windows, atau 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 menggunakan sintaks jalur untuk menemukan nilai.
Dapatkan string:
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj name.last
SmithDapatkan blok JSON:
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj name
{ " first " : " Tom " , " last " : " Smith " }Cobalah untuk mendapatkan kunci yang tidak ada:
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj name.middle
nullDapatkan nilai string mentah:
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj -r name.last
" Smith "Dapatkan nilai array dengan indeks:
$ echo ' {"friends":["Tom","Jane","Carol"]} ' | jj friends.1
Jane Ada dukungan untuk jalur JSON menggunakan .. Path Prefix. Yang bila ditentukan, perlakukan dokumen multi-lined sebagai array.
Misalnya:
{"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
Sintaks jalur untuk pengaturan nilai memiliki beberapa perbedaan kecil daripada untuk mendapatkan nilai.
Opsi -v value terdeteksi secara otomatis sebagai angka, boolean, nol, atau string. Anda dapat mengganti deteksi otomatis dan memasukkan JSON mentah dengan memasukkan opsi -r . Ini berguna untuk blok JSON mentah seperti objek, array, atau string yang ditalangi preman.
Perbarui nilai:
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj -v Andy name.first
{ " name " :{ " first " : " Andy " , " last " : " Smith " }}Tetapkan nilai baru:
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj -v 46 age
{ " age " :46, " name " :{ " first " : " Tom " , " last " : " Smith " }}Tetapkan nilai bersarang baru:
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj -v relax task.today
{ " task " :{ " today " : " relax " }, " name " :{ " first " : " Tom " , " last " : " Smith " }}Ganti nilai array dengan indeks:
$ echo ' {"friends":["Tom","Jane","Carol"]} ' | jj -v Andy friends.1
{ " friends " :[ " Tom " , " Andy " , " Carol " ]}Tambahkan array:
$ echo ' {"friends":["Tom","Jane","Carol"]} ' | jj -v Andy friends.-1
{ " friends " :[ " Tom " , " Andy " , " Carol " , " Andy " ]}Tetapkan nilai array yang melewati batas:
$ echo ' {"friends":["Tom","Jane","Carol"]} ' | jj -v Andy friends.5
{ " friends " :[ " Tom " , " Andy " , " Carol " ,null,null, " Andy " ]}Atur blok mentah JSON:
$ echo ' {"name":"Carol"} ' | jj -r -v ' ["Tom","Andy"] ' friends
{ " friends " :[ " Tom " , " Andy " ], " name " : " Carol " }Mulai dokumen JSON baru:
$ echo ' ' | jj -v ' Sam ' name.first
{ " name " :{ " first " : " Sam " }}Hapus nilai:
$ echo ' {"age":46,"name":{"first":"Tom","last":"Smith"}} ' | jj -D age
{ " name " :{ " first " : " Tom " , " last " : " Smith " }}Hapus nilai array dengan indeks:
$ echo ' {"friends":["Andy","Carol"]} ' | jj -D friends.0
{ " friends " :[ " Carol " ]}Hapus item terakhir di Array:
$ echo ' {"friends":["Andy","Carol"]} ' | jj -D friends.-1
{ " friends " :[ " Andy " ]} Opsi -O dapat digunakan ketika penelepon mengharapkan bahwa nilai pada tombol yang ditentukan sudah ada.
Menggunakan opsi ini dapat mempercepat operasi sebanyak 6x, tetapi memperlambat sebanyak 20% ketika nilainya tidak ada.
Misalnya:
echo '{"name":{"first":"Tom","last":"Smith"}}' | jj -v Tim -O name.first
The -O memberi tahu JJ bahwa name.first Pertama kemungkinan ada, jadi cobalah operasi FastTrack terlebih dahulu.
Bendera -p akan membuat output JSON cantik.
$ echo '{"name":{"first":"Tom","last":"Smith"}}' | jj -p name
{
"first": "Tom",
"last": "Smith"
}
Juga keypath adalah opsional ketika bendera -p ditentukan, memungkinkan seluruh dokumen JSON dibuat cantik.
$ echo '{"name":{"first":"Tom","last":"Smith"}}' | jj -p
{
"name": {
"first": "Tom",
"last": "Smith"
}
}
Bendera -u akan memampatkan JSON ke dalam karakter secukupnya yang dimungkinkan dengan meremas Newline dan Spaces.
Perbandingan cepat JJ dengan JQ. File Test JSON adalah file 180MB dari 206.560 paket kota di San Francisco.
Diuji pada MacBook Pro 2015 yang menjalankan JQ 1.5 dan JJ 1.0.0
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.295sJosh Baker @tidwall
Kode sumber JJ tersedia di bawah lisensi MIT.