
Éditeur de stream JSON
JJ est un utilitaire de ligne de commande qui fournit un moyen rapide et simple de récupérer ou de mettre à jour les valeurs des documents JSON. Il est alimenté par GJSON et SJSON sous le capot.
C'est rapide car il évite d'analyser des sections non pertinentes de JSON, de sauter des valeurs qui ne s'appliquent pas et abandonnent dès que la valeur cible a été trouvée ou mise à jour.
brew install tidwall/jj/jj
make
Ou téléchargez un binaire pré-construit pour 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 utilise une syntaxe de chemin pour trouver des valeurs.
Obtenez une chaîne:
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj name.last
SmithObtenez un bloc de JSON:
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj name
{ " first " : " Tom " , " last " : " Smith " }Essayez d'obtenir une clé inexistante:
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj name.middle
nullObtenez la valeur de chaîne brute:
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj -r name.last
" Smith "Obtenez une valeur de tableau par index:
$ echo ' {"friends":["Tom","Jane","Carol"]} ' | jj friends.1
Jane Il y a une prise en charge des lignes JSON en utilisant le préfixe de chemin .. Qui, lorsqu'il est spécifié, traite le document multi-mobile comme un tableau.
Par exemple:
{"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 syntaxe de chemin pour la définition des valeurs a quelques minuscules différences que pour l'obtention des valeurs.
L'option -v value est automatiquement détectée en tant que nombre, booléen, nul ou chaîne. Vous pouvez remplacer la détection automatique et saisir JSON brut en incluant l'option -r . Ceci est utile pour les blocs JSON bruts tels que l'objet, les tableaux ou les chaînes prémarshalled.
Mettre à jour une valeur:
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj -v Andy name.first
{ " name " :{ " first " : " Andy " , " last " : " Smith " }}Définissez une nouvelle valeur:
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj -v 46 age
{ " age " :46, " name " :{ " first " : " Tom " , " last " : " Smith " }}Définissez une nouvelle valeur imbriquée:
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj -v relax task.today
{ " task " :{ " today " : " relax " }, " name " :{ " first " : " Tom " , " last " : " Smith " }}Remplacez une valeur de tableau par index:
$ echo ' {"friends":["Tom","Jane","Carol"]} ' | jj -v Andy friends.1
{ " friends " :[ " Tom " , " Andy " , " Carol " ]}Ajouter un tableau:
$ echo ' {"friends":["Tom","Jane","Carol"]} ' | jj -v Andy friends.-1
{ " friends " :[ " Tom " , " Andy " , " Carol " , " Andy " ]}Définissez une valeur de tableau qui dépasse les limites:
$ echo ' {"friends":["Tom","Jane","Carol"]} ' | jj -v Andy friends.5
{ " friends " :[ " Tom " , " Andy " , " Carol " ,null,null, " Andy " ]}Réglez un bloc brut de JSON:
$ echo ' {"name":"Carol"} ' | jj -r -v ' ["Tom","Andy"] ' friends
{ " friends " :[ " Tom " , " Andy " ], " name " : " Carol " }Démarrer le nouveau document JSON:
$ echo ' ' | jj -v ' Sam ' name.first
{ " name " :{ " first " : " Sam " }}Supprimer une valeur:
$ echo ' {"age":46,"name":{"first":"Tom","last":"Smith"}} ' | jj -D age
{ " name " :{ " first " : " Tom " , " last " : " Smith " }}Supprimer une valeur de tableau par index:
$ echo ' {"friends":["Andy","Carol"]} ' | jj -D friends.0
{ " friends " :[ " Carol " ]}Supprimer le dernier élément dans le tableau:
$ echo ' {"friends":["Andy","Carol"]} ' | jj -D friends.-1
{ " friends " :[ " Andy " ]} L'option -O peut être utilisée lorsque l'appelant s'attend à ce qu'une valeur sur le cheype spécifié existe déjà.
L'utilisation de cette option peut accélérer une opération jusqu'à 6x, mais ralentir jusqu'à 20% lorsque la valeur n'existe pas.
Par exemple:
echo '{"name":{"first":"Tom","last":"Smith"}}' | jj -v Tim -O name.first
Le -O dit à JJ que le name.first .
L'indicateur -p fera la sortie JSON Pretty.
$ echo '{"name":{"first":"Tom","last":"Smith"}}' | jj -p name
{
"first": "Tom",
"last": "Smith"
}
De plus, le thème de la touche est facultatif lorsque l'indicateur -p est spécifié, permettant à l'ensemble du document JSON d'être jolie.
$ echo '{"name":{"first":"Tom","last":"Smith"}}' | jj -p
{
"name": {
"first": "Tom",
"last": "Smith"
}
}
Le drapeau -u comprimera le JSON dans le moins de personnages possibles en écrasant les Newlines et les espaces.
Une comparaison rapide de JJ à JQ. Le fichier JSON de test est de 180 Mo de 206 560 parcelles de ville à San Francisco.
Testé sur un MacBook Pro 2015 exécutant JQ 1.5 et 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
Le code source JJ est disponible sous la licence MIT.