
JSONストリームエディター
JJは、JSONドキュメントから値を取得または更新する高速かつ簡単な方法を提供するコマンドラインユーティリティです。それはフードの下でGJSONとSJSONを搭載しています。
JSONの無関係なセクションの解析を避け、適用されない値をスキップすることを避け、目標値が見つかったり更新されたりするとすぐに中止するためです。
brew install tidwall/jj/jj
make
または、Linux、OSX、Windows、または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は、値を見つけるためにパス構文を使用します。
文字列を取得:
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj name.last
SmithJSONのブロックを取得します:
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj name
{ " first " : " Tom " , " last " : " Smith " }存在しないキーを取得してみてください:
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj name.middle
null生の文字列値を取得します:
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj -r name.last
" Smith "インデックスで配列値を取得します:
$ echo ' {"friends":["Tom","Jane","Carol"]} ' | jj friends.1
JanePATHプレフィックスを使用して.. JSONラインのサポートがあります。指定すると、マルチラインのドキュメントを配列として扱います。
例えば:
{"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
値を設定するためのパス構文には、値を取得するよりもいくつかの小さな違いがあります。
-v valueオプションは、数字、ブール、ヌル、または文字列として自動検出されます。 -rオプションを含めることにより、自動検出をオーバーライドし、RAW JSONを入力できます。これは、オブジェクト、アレイ、または既製の文字列などの生のJSONブロックに役立ちます。
値を更新します:
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj -v Andy name.first
{ " name " :{ " first " : " Andy " , " last " : " Smith " }}新しい値を設定します:
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj -v 46 age
{ " age " :46, " name " :{ " first " : " Tom " , " last " : " Smith " }}新しいネストされた値を設定します:
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj -v relax task.today
{ " task " :{ " today " : " relax " }, " name " :{ " first " : " Tom " , " last " : " Smith " }}インデックスで配列値を置き換えます。
$ echo ' {"friends":["Tom","Jane","Carol"]} ' | jj -v Andy friends.1
{ " friends " :[ " Tom " , " Andy " , " Carol " ]}配列を追加します。
$ echo ' {"friends":["Tom","Jane","Carol"]} ' | jj -v Andy friends.-1
{ " friends " :[ " Tom " , " Andy " , " Carol " , " Andy " ]}境界を超えた配列値を設定します。
$ echo ' {"friends":["Tom","Jane","Carol"]} ' | jj -v Andy friends.5
{ " friends " :[ " Tom " , " Andy " , " Carol " ,null,null, " Andy " ]}JSONの生ブロックを設定します:
$ echo ' {"name":"Carol"} ' | jj -r -v ' ["Tom","Andy"] ' friends
{ " friends " :[ " Tom " , " Andy " ], " name " : " Carol " }新しいJSONドキュメントを開始します:
$ echo ' ' | jj -v ' Sam ' name.first
{ " name " :{ " first " : " Sam " }}値を削除します:
$ echo ' {"age":46,"name":{"first":"Tom","last":"Smith"}} ' | jj -D age
{ " name " :{ " first " : " Tom " , " last " : " Smith " }}インデックスごとに配列値を削除します。
$ echo ' {"friends":["Andy","Carol"]} ' | jj -D friends.0
{ " friends " :[ " Carol " ]}配列で最後のアイテムを削除します:
$ echo ' {"friends":["Andy","Carol"]} ' | jj -D friends.-1
{ " friends " :[ " Andy " ]}-Oオプションは、指定されたキーパスの値が既に存在することを発信者が期待したときに使用できます。
このオプションを使用すると、操作を最大6倍スピードアップできますが、値が存在しない場合は20%も減速します。
例えば:
echo '{"name":{"first":"Tom","last":"Smith"}}' | jj -v Tim -O name.first
-O JJにname.firstが存在する可能性が高いことを伝えますので、最初にFastTrack操作を試してください。
-pフラグは、出力JSONをきれいにします。
$ echo '{"name":{"first":"Tom","last":"Smith"}}' | jj -p name
{
"first": "Tom",
"last": "Smith"
}
また、 -pフラグが指定されている場合、キーパスはオプションであり、JSONドキュメント全体をきれいにすることができます。
$ echo '{"name":{"first":"Tom","last":"Smith"}}' | jj -p
{
"name": {
"first": "Tom",
"last": "Smith"
}
}
-uフラグは、JSONを新しいラインとスペースをつぶすことで、可能な限り少ないキャラクターに圧縮します。
JJとJQの簡単な比較。テストJSONファイルは、サンフランシスコの206,560の都市区画の180MBファイルです。
JQ 1.5とJJ 1.0.0を実行している2015 MacBook Proでテスト
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.295sジョシュ・ベイカー@tidwall
JJソースコードは、MITライセンスの下で利用できます。