
JSON Stream Editor
JJ ist ein Befehlszeilendienstprogramm, das eine schnelle und einfache Möglichkeit bietet, Werte aus JSON -Dokumenten abzurufen oder zu aktualisieren. Es wird von Gjson und Sjson unter der Motorhaube angetrieben.
Es ist schnell, weil es vermeidet, irrelevante Abschnitte von JSON zu analysieren, Werte zu überspringen, die nicht gelten, und abbricht, sobald der Zielwert gefunden oder aktualisiert wurde.
brew install tidwall/jj/jj
make
Oder laden Sie eine vorgefertigte Binärdatei für Linux, OSX, Windows oder FreeBSD herunter.
$ 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 verwendet eine Pfadsyntax zum Finden von Werten.
Holen Sie sich eine Zeichenfolge:
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj name.last
SmithHolen Sie sich einen Block JSON:
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj name
{ " first " : " Tom " , " last " : " Smith " }Versuchen Sie, einen nicht existierenden Schlüssel zu erhalten:
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj name.middle
nullHolen Sie sich den RAW -Stringwert:
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj -r name.last
" Smith "Holen Sie sich einen Array -Wert nach Index:
$ echo ' {"friends":["Tom","Jane","Carol"]} ' | jj friends.1
Jane Es gibt Unterstützung für JSON -Linien mit dem .. -Präfix. Wenn Sie angegeben sind, behandelt das mehrfach ausgeführte Dokument als Array.
Zum Beispiel:
{"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
Die Pfadsyntax für das Einstellen von Werten hat einige winzige Unterschiede als zum Erhalten von Werten.
Die Option -v value ist automatisch als Zahl, boolean, null oder string erfasst. Sie können die automatische Erkennung überschreiben und RAW JSON eingeben, indem Sie die Option -r einbeziehen. Dies ist nützlich für Roh -JSON -Blöcke wie Objekt, Arrays oder Premarshalled -Saiten.
Aktualisieren Sie einen Wert:
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj -v Andy name.first
{ " name " :{ " first " : " Andy " , " last " : " Smith " }}Setzen Sie einen neuen Wert:
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj -v 46 age
{ " age " :46, " name " :{ " first " : " Tom " , " last " : " Smith " }}Setzen Sie einen neuen verschachtelten Wert:
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj -v relax task.today
{ " task " :{ " today " : " relax " }, " name " :{ " first " : " Tom " , " last " : " Smith " }}Ersetzen Sie einen Arraywert durch Index:
$ echo ' {"friends":["Tom","Jane","Carol"]} ' | jj -v Andy friends.1
{ " friends " :[ " Tom " , " Andy " , " Carol " ]}Ein Array anhängen:
$ echo ' {"friends":["Tom","Jane","Carol"]} ' | jj -v Andy friends.-1
{ " friends " :[ " Tom " , " Andy " , " Carol " , " Andy " ]}Legen Sie einen Array -Wert fest, der über die Grenzen hinausgeht:
$ echo ' {"friends":["Tom","Jane","Carol"]} ' | jj -v Andy friends.5
{ " friends " :[ " Tom " , " Andy " , " Carol " ,null,null, " Andy " ]}Setzen Sie einen rohen Block von JSON:
$ echo ' {"name":"Carol"} ' | jj -r -v ' ["Tom","Andy"] ' friends
{ " friends " :[ " Tom " , " Andy " ], " name " : " Carol " }Starten Sie das neue JSON -Dokument:
$ echo ' ' | jj -v ' Sam ' name.first
{ " name " :{ " first " : " Sam " }}Einen Wert löschen:
$ echo ' {"age":46,"name":{"first":"Tom","last":"Smith"}} ' | jj -D age
{ " name " :{ " first " : " Tom " , " last " : " Smith " }}Löschen Sie einen Array -Wert nach Index:
$ echo ' {"friends":["Andy","Carol"]} ' | jj -D friends.0
{ " friends " :[ " Carol " ]}Löschen Sie den letzten Artikel in Array:
$ echo ' {"friends":["Andy","Carol"]} ' | jj -D friends.-1
{ " friends " :[ " Andy " ]} Die Option -O kann verwendet werden, wenn der Anrufer erwartet, dass ein Wert am angegebenen Tastatur bereits vorhanden ist.
Die Verwendung dieser Option kann einen Betrieb um bis zu 6x beschleunigen, jedoch bis zu 20% verlangsamen, wenn der Wert nicht vorhanden ist.
Zum Beispiel:
echo '{"name":{"first":"Tom","last":"Smith"}}' | jj -v Tim -O name.first
Der -O sagt JJ, dass der name.first wahrscheinlich vorhanden ist.
Das -p -Flag macht den Ausgang JSON hübsch.
$ echo '{"name":{"first":"Tom","last":"Smith"}}' | jj -p name
{
"first": "Tom",
"last": "Smith"
}
Auch der Tastatur ist optional, wenn das -p -Flag angegeben ist, sodass das gesamte JSON -Dokument hübsch gemacht werden kann.
$ echo '{"name":{"first":"Tom","last":"Smith"}}' | jj -p
{
"name": {
"first": "Tom",
"last": "Smith"
}
}
Die -u -Flagge wird den JSON in die wenigsten Charaktere komprimieren, indem sie Newlines und Leerzeichen zerquetschen.
Ein kurzer Vergleich von JJ mit JQ. Die Test -JSON -Datei der Testdatei von 180 MB von 206.560 Stadtpaketen in San Francisco.
Getestet an einem 2015 MacBook Pro mit JQ 1.5 und 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
Der JJ -Quellcode ist unter der MIT -Lizenz verfügbar.