
Editor de la transmisión json
JJ es una utilidad de línea de comandos que proporciona una forma rápida y simple de recuperar o actualizar los valores de los documentos JSON. Está impulsado por Gjson y Sjson debajo del capó.
Es rápido porque evita analizar secciones irrelevantes de JSON, omitir los valores que no se aplican y aborta tan pronto como se ha encontrado o actualizado el valor objetivo.
brew install tidwall/jj/jj
make
O descargue un binario preconstruido para Linux, OSX, Windows o 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 usa una sintaxis de ruta para encontrar valores.
Obtenga una cadena:
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj name.last
SmithObtenga un bloque de JSON:
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj name
{ " first " : " Tom " , " last " : " Smith " }Intente obtener una clave inexistente:
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj name.middle
nullObtenga el valor de cadena sin procesar:
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj -r name.last
" Smith "Obtenga un valor de matriz por índice:
$ echo ' {"friends":["Tom","Jane","Carol"]} ' | jj friends.1
Jane Hay soporte para las líneas JSON usando el prefijo de .. ruta. Que cuando se especifica, trata el documento múltiple como una matriz.
Por ejemplo:
{"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
La sintaxis de la ruta para establecer valores tiene un par de pequeñas diferencias que para obtener valores.
La opción -v value se detecta automáticamente como un número, booleano, nulo o cadena. Puede anular la detección automática y la entrada RAW JSON al incluir la opción -r . Esto es útil para bloques JSON en bruto, como objetos, matrices o cadenas premarshalled.
Actualizar un valor:
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj -v Andy name.first
{ " name " :{ " first " : " Andy " , " last " : " Smith " }}Establecer un nuevo valor:
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj -v 46 age
{ " age " :46, " name " :{ " first " : " Tom " , " last " : " Smith " }}Establezca un nuevo valor anidado:
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj -v relax task.today
{ " task " :{ " today " : " relax " }, " name " :{ " first " : " Tom " , " last " : " Smith " }}Reemplace un valor de matriz por índice:
$ echo ' {"friends":["Tom","Jane","Carol"]} ' | jj -v Andy friends.1
{ " friends " :[ " Tom " , " Andy " , " Carol " ]}Agregar una matriz:
$ echo ' {"friends":["Tom","Jane","Carol"]} ' | jj -v Andy friends.-1
{ " friends " :[ " Tom " , " Andy " , " Carol " , " Andy " ]}Establezca un valor de matriz que haya pasado los límites:
$ echo ' {"friends":["Tom","Jane","Carol"]} ' | jj -v Andy friends.5
{ " friends " :[ " Tom " , " Andy " , " Carol " ,null,null, " Andy " ]}Establezca un bloque crudo de JSON:
$ echo ' {"name":"Carol"} ' | jj -r -v ' ["Tom","Andy"] ' friends
{ " friends " :[ " Tom " , " Andy " ], " name " : " Carol " }Inicie el documento New JSON:
$ echo ' ' | jj -v ' Sam ' name.first
{ " name " :{ " first " : " Sam " }}Eliminar un valor:
$ echo ' {"age":46,"name":{"first":"Tom","last":"Smith"}} ' | jj -D age
{ " name " :{ " first " : " Tom " , " last " : " Smith " }}Eliminar un valor de matriz por índice:
$ echo ' {"friends":["Andy","Carol"]} ' | jj -D friends.0
{ " friends " :[ " Carol " ]}Eliminar el último artículo en la matriz:
$ echo ' {"friends":["Andy","Carol"]} ' | jj -D friends.-1
{ " friends " :[ " Andy " ]} La opción -O se puede usar cuando la persona que llama espera que ya exista un valor en el teclado especificado.
El uso de esta opción puede acelerar una operación hasta 6x, pero disminuye hasta un 20% cuando el valor no existe.
Por ejemplo:
echo '{"name":{"first":"Tom","last":"Smith"}}' | jj -v Tim -O name.first
El -O le dice a JJ que el name.first probablemente existe, así que intente primero una operación FastTrack.
El indicador -p hará que la salida json sea bonita.
$ echo '{"name":{"first":"Tom","last":"Smith"}}' | jj -p name
{
"first": "Tom",
"last": "Smith"
}
Además, el keypath es opcional cuando se especifica el indicador -p , lo que permite que todo el documento JSON se haga bonito.
$ echo '{"name":{"first":"Tom","last":"Smith"}}' | jj -p
{
"name": {
"first": "Tom",
"last": "Smith"
}
}
La bandera -u comprimirá el JSON en la menor cantidad de personajes posibles posibles al aplastar nuevas líneas y espacios.
Una comparación rápida de JJ con JQ. El archivo de prueba JSON es un archivo de 180 MB de 206,560 parcelas de la ciudad en San Francisco.
Probado en un MacBook Pro 2015 que ejecuta JQ 1.5 y 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
El código fuente de JJ está disponible bajo la licencia MIT.