
Редактор JSON Stream
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
SmithПолучите блок json:
$ 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
Jane Есть поддержка линий 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 автоматически определяется как число, логическое, ноль или строка. Вы можете переопределить автоматическое обнаружение и ввести Raw JSON, включив опцию -r . Это полезно для необработанных блоков 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 может использоваться, когда вызывающий абонент ожидает, что значение в указанном клавиатуре уже существует.
Использование этой опции может ускорить операцию на целых 6x, но замедлить до 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. Файл Test JSON составляет 180 МБ файл из 206 560 городских участков в Сан -Франциско.
Протестировано на MacBook Pro 2015 года JQ 1.5 и 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.295sДжош Бейкер @tidwall
Исходный код JJ доступен по лицензии MIT.