
JSON Stream Editor
JJ é um utilitário de linha de comando que fornece uma maneira rápida e simples de recuperar ou atualizar valores dos documentos JSON. É alimentado por Gjson e Sjson sob o capô.
É rápido porque evita a análise de seções irrelevantes do JSON, pulando valores que não se aplicam e abortos assim que o valor do alvo for encontrado ou atualizado.
brew install tidwall/jj/jj
make
Ou faça o download de um binário pré-construído para Linux, OSX, Windows ou 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 uma sintaxe do caminho para encontrar valores.
Obtenha uma string:
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj name.last
SmithObtenha um bloco de JSON:
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj name
{ " first " : " Tom " , " last " : " Smith " }Tente obter uma chave inexistente:
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj name.middle
nullObtenha o valor da string cru:
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj -r name.last
" Smith "Obtenha um valor de matriz por índice:
$ echo ' {"friends":["Tom","Jane","Carol"]} ' | jj friends.1
Jane Há suporte para linhas JSON usando o prefixo do .. Path. Que, quando especificado, trata o documento múltiplo como uma matriz.
Por exemplo:
{"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
A sintaxe do caminho para definir valores tem algumas pequenas diferenças do que para obter valores.
A opção -v value é detectada automaticamente como um número, booleano, nulo ou string. Você pode substituir a detecção automática e a entrada JSON bruto, incluindo a opção -r . Isso é útil para blocos JSON brutos, como objeto, matrizes ou seqüências de cordas pré -maricas.
Atualize um valor:
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj -v Andy name.first
{ " name " :{ " first " : " Andy " , " last " : " Smith " }}Defina um novo valor:
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj -v 46 age
{ " age " :46, " name " :{ " first " : " Tom " , " last " : " Smith " }}Defina um novo valor aninhado:
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj -v relax task.today
{ " task " :{ " today " : " relax " }, " name " :{ " first " : " Tom " , " last " : " Smith " }}Substitua um valor de matriz por índice:
$ echo ' {"friends":["Tom","Jane","Carol"]} ' | jj -v Andy friends.1
{ " friends " :[ " Tom " , " Andy " , " Carol " ]}Anexar uma matriz:
$ echo ' {"friends":["Tom","Jane","Carol"]} ' | jj -v Andy friends.-1
{ " friends " :[ " Tom " , " Andy " , " Carol " , " Andy " ]}Defina um valor de matriz que passou dos limites:
$ echo ' {"friends":["Tom","Jane","Carol"]} ' | jj -v Andy friends.5
{ " friends " :[ " Tom " , " Andy " , " Carol " ,null,null, " Andy " ]}Defina um bloco bruto de JSON:
$ echo ' {"name":"Carol"} ' | jj -r -v ' ["Tom","Andy"] ' friends
{ " friends " :[ " Tom " , " Andy " ], " name " : " Carol " }Inicie o novo documento JSON:
$ echo ' ' | jj -v ' Sam ' name.first
{ " name " :{ " first " : " Sam " }}Exclua um valor:
$ echo ' {"age":46,"name":{"first":"Tom","last":"Smith"}} ' | jj -D age
{ " name " :{ " first " : " Tom " , " last " : " Smith " }}Exclua um valor de matriz por índice:
$ echo ' {"friends":["Andy","Carol"]} ' | jj -D friends.0
{ " friends " :[ " Carol " ]}Exclua o último item na matriz:
$ echo ' {"friends":["Andy","Carol"]} ' | jj -D friends.-1
{ " friends " :[ " Andy " ]} A opção -O pode ser usada quando o chamador espera que um valor no Keypath especificado já exista.
O uso dessa opção pode acelerar uma operação em até 6x, mas diminuir a velocidade de 20% quando o valor não existir.
Por exemplo:
echo '{"name":{"first":"Tom","last":"Smith"}}' | jj -v Tim -O name.first
O -O diz a JJ que o name.first Primeiro provavelmente existe, então tente uma operação FastTrack primeiro.
O sinalizador -p tornará a saída JSON bonita.
$ echo '{"name":{"first":"Tom","last":"Smith"}}' | jj -p name
{
"first": "Tom",
"last": "Smith"
}
Além disso, o Keypath é opcional quando o sinalizador -p é especificado, permitindo que todo o documento JSON seja bonito.
$ echo '{"name":{"first":"Tom","last":"Smith"}}' | jj -p
{
"name": {
"first": "Tom",
"last": "Smith"
}
}
A bandeira -u compactará o JSON com o menor número de caracteres possíveis, esmagando novas linhas e espaços.
Uma rápida comparação de JJ com JQ. O arquivo JSON de teste é um arquivo de 180 MB de 206.560 parcelas da cidade em San Francisco.
Testado em um MacBook Pro 2015 Running JQ 1.5 e 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
O código -fonte JJ está disponível sob a licença do MIT.