Анализатор JSON командной строки Unix? [закрыто]

128

Может ли кто-нибудь порекомендовать парсер JSON для Unix (выберите свой вариант), который можно было бы использовать для анализа значений из ответа JSON в конвейере?

Jé Queue
источник
Мне нравится использовать pythonpy ( github.com/russell91/pythonpy ): cat a.json | py --ji -x 'x.attr'
Рассел Стюарт
1
В городе появился новый инструмент: ramda-cli , который использует каррированный api Ramda и сжатый синтаксис LiveScript. Он построен для приема json в качестве входных данных и составления функций. npm install -g ramda-cli
Ehvince

Ответы:

18

Вы можете использовать этот синтаксический анализатор командной строки (который вы можете поместить в псевдоним bash, если хотите), используя модули, встроенные в ядро ​​Perl:

perl -MData::Dumper -MJSON::PP=from_json -ne'print Dumper(from_json($_))'
простой эфир
источник
1
Меня смущает вывод этого. Вывод включает жирные стрелки (=>) между ключами и значениями. Это не JSON.
Лэндон Кун
7
@landon: нет, входными данными является JSON, а на выходе - собственная структура данных Perl, которой вы можете при необходимости управлять. Суть этого однострочника в том, что он создает данные, которые намного легче читать.
Эфир
1
Если вам нужен вывод JSON, вы можете использовать этот однострочник Perl:perl -e "use JSON; print to_json( decode_json(<>), { pretty => 1 } )"
Георгий Владимиров
233

Я предпочитаю то, python -m json.toolчто по умолчанию доступно в большинстве операционных систем * nix.

$ echo '{"foo":1, "bar":2}' | python -m json.tool
{
    "bar": 2, 
    "foo": 1
}

Примечание. В зависимости от вашей версии Python все ключи могут быть отсортированы в алфавитном порядке, что может быть хорошо, а может и не быть. В python 2 по умолчанию ключи сортировались, тогда как в python 3.5+ они больше не сортируются автоматически, но у вас есть возможность явно сортировать по ключу:

$ echo '{"foo":1, "bar":2}' | python3 -m json.tool --sort-keys
{
    "bar": 2, 
    "foo": 1
}
muhqu
источник
5
Недооцененный ответ. Это хорошая альтернатива командной строки, если цель состоит в том, чтобы проверить, что данный файл JSON содержит действительный JSON.
scorpiodawg
10
в этом ответе не описано, как проверять значения указанного ключа.
Колин Су
8
@ColinSu, но это тоже не исходный вопрос. json.toolэто просто короткая рука, чтобы красиво печатать json. Если вам нужно извлекать / манипулировать данными json в сценарии оболочки, я бы использовал jqэто просто потрясающе в том, что делает ...
muhqu
1
IMMO, это неправильный ответ, потому что python json.toolделает только две вещи: проверяет и печатает json. Он НЕ анализирует значения в json, как это jqделает.
Деви,
1
@AdityaSriram полезно знать! … Добавит эту информацию к ответу.
muhqu
144

Если вы ищете портативный инструмент, скомпилированный на C:

http://stedolan.github.com/jq/

С веб-сайта:

jq похож на sed для данных JSON - вы можете использовать его для нарезки, фильтрации, сопоставления и преобразования структурированных данных с той же легкостью, что и sed , awk , grep. и их друзья позволяют вам играть с текстом.

jq может преобразовать формат данных, который у вас есть, в тот, который вам нужен, с очень небольшими усилиями, а программа для этого часто короче и проще, чем вы ожидали.

Учебник : http://stedolan.github.com/jq/tutorial/
Руководство : http://stedolan.github.com/jq/manual/
Загрузить : http://stedolan.github.com/jq/download/

Даан Мортье
источник
20
Лучший ответ здесь имо. Никаких тяжелых зависимостей, небольшая, мощная, хорошая документация и легкий ветерок, чтобы попробовать. Большое спасибо за предложение!
FrozenCow
В Ubuntu / Debian вы можете просто apt install jq.
Пабло А.
Я просил это много месяцев назад и научился любить jq.
Jé Queue
63

Я создал модуль, специально разработанный для работы с JSON в командной строке:

https://github.com/ddopson/underscore-cli

  • ГИБКИЙ - инструмент "швейцарский армейский нож" для обработки данных JSON - может использоваться как простой симпатичный принтер или как полнофункциональная командная строка Javascript.
  • МОЩНЫЙ - раскрывает всю мощь и функциональность underscore.js (плюс underscore.string)
  • SIMPLE - Делает это просто написать JS остроты аналогично использования «Perl -pe»
  • CHAINED - несколько вызовов команд могут быть объединены в цепочку для создания конвейера обработки данных.
  • МУЛЬТИФОРМАТ - широкая поддержка форматов ввода / вывода - красивый шрифт, строгий JSON и т. Д. [Скоро будет]
  • ДОКУМЕНТОВАНО - отличная документация по командной строке с множеством примеров для каждой команды.

Это позволяет вам очень легко делать мощные вещи:

cat earthporn.json | underscore select '.data .title'
# [ 'Fjaðrárgljúfur canyon, Iceland [OC] [683x1024]',
#   'New town, Edinburgh, Scotland [4320 x 3240]',
#   'Sunrise in Bryce Canyon, UT [1120x700] [OC]',
# ...
#   'Kariega Game Reserve, South Africa [3584x2688]',
#   'Valle de la Luna, Chile [OS] [1024x683]',
#   'Frosted trees after a snowstorm in Laax, Switzerland [OC] [1072x712]' ]

cat earthporn.json | underscore select '.data .title' | underscore count
# 25

underscore map --data '[1, 2, 3, 4]' 'value+1'
# prints: [ 2, 3, 4, 5 ]

underscore map --data '{"a": [1, 4], "b": [2, 8]}' '_.max(value)'
# [ 4, 8 ]

echo '{"foo":1, "bar":2}' | underscore map -q 'console.log("key = ", key)'
# key = foo
# key = bar

underscore pluck --data "[{name : 'moe', age : 40}, {name : 'larry', age : 50}, {name : 'curly', age : 60}]" name
# [ 'moe', 'larry', 'curly' ]

underscore keys --data '{name : "larry", age : 50}'
# [ 'name', 'age' ]

underscore reduce --data '[1, 2, 3, 4]' 'total+value'
# 10

И у него есть один из лучших доступных форматеров JSON для "умных пробелов":

Если у вас есть какие-либо пожелания по функциям, прокомментируйте этот пост или добавьте проблему в github. Я был бы рад расставить приоритеты в функциях, которые нужны членам сообщества.

Дэйв Допсон
источник
Потрясающие! Но можно ли запускать консольные команды для данных JSON? Например: для файла JSON с массивом wgetURL-адресов каждый URL.
Камило Мартин,
@CamiloMartin - самый простой способ сделать это - распечатать URL-адреса, по одному URL-адресу в строке, а затем запустить это через xargs или параллельно GNU.
Дэйв Допсон
@DaveDopson Могу ли я использовать underscoreдля разбора вложенный json с вложенными объектами и массивами?
user227666
1
@ user227666 - конечно. JSON поддерживает многоуровневое вложение объектов. Или вы можете иметь в виду JSON, в котором есть строка, которая дополнительно кодирует JSON. Что тоже работает, но требует лишь некоторых усилий.
Дэйв Допсон
@DaveDopson Поддерживает ли подчеркивание "содержит" шаблон, т.е. для конкретного «ключа» возможный набор (без учета регистра) значений? Я попробовал "jq" с match, но это не сработало. Также здесь опубликован мой полный вариант использования - stackoverflow.com/questions/25463196/…
ekta
13

Оформить заказ TickTick .

Это настоящий парсер Bash JSON.

#!/bin/bash
. /path/to/ticktick.sh

# File
DATA=`cat data.json`
# cURL
#DATA=`curl http://foobar3000.com/echo/request.json`

tickParse "$DATA"

echo ``pathname``
echo ``headers["user-agent"]``
coolaj86
источник
Должен любить инструменты уровня оболочки :)
Jé Queue,
12

Также имеется набор инструментов для обработки командной строки JSON. если в вашем стеке есть node.js и npm.

И другой команда "json" для массирования JSON в командной строке Unix.

А вот и другие альтернативы:


Связано: Инструмент командной строки для анализа ввода JSON для Unix?

zpoley
источник
Простая установка в Ubuntu: sudo apt-get install python-pip && sudo pip install jsonpipe
activout.se
@ Divideandconquer.se Извините, но вы устанавливаете этот инструмент с помощью npm с npm install json.
gitaarik
@rednaw К сожалению, пакет NPM, jsonпохоже, теперь заменен совершенно другим пакетом.
Брэд
8

Кто-нибудь упомянул Jshon или JSON.sh?

https://github.com/keenerd/jshon

конвейер json к нему, и он просматривает объекты json и распечатывает путь к текущему объекту (в виде массива JSON), а затем к объекту без пробелов.

http://kmkeen.com/jshon/
Jshon загружает текст json из stdin, выполняет действия, затем отображает последнее действие в stdout, а также был включен в обычный конвейер обработки текста.

hewigovens
источник
Пример использования на OSX: brew install jshon,cat *.json | jshon
kenorb
2

Вы можете попробовать jsawk, как предлагается в этом ответе .

На самом деле вы могли бы создать для этого быстрый скрипт на Python.

NG.
источник
1

Для Bash / Python вот базовая оболочка для python simplejson:

json_parser() {
    local jsonfile="my_json_file.json"
    local tc="import simplejson,sys; myjsonstr=sys.stdin.read(); "`
            `"myjson=simplejson.loads(myjsonstr);"
    # Build python print command based on $@
    local printcmd="print myjson"
    for (( argn=1; argn<=$#; argn++ )); do
        printcmd="$printcmd['${!argn}']"
    done
    local result=$(python -c "$tc $printcmd.keys()" <$jsonfile 2>/dev/null \
        || python -c "$tc $printcmd" <$jsonfile 2>/dev/null)
    # For returning space-separated values
    echo $result|sed -e "s/[]|[|,|']//g"
    #echo $result 
}

Он действительно обрабатывает данные только в стиле вложенного словаря, но он работает для того, что мне было нужно, и полезен для просмотра json. Наверное, можно было бы адаптировать по вкусу.

В любом случае, что-то самодельное для тех, кто не хочет использовать еще одну внешнюю зависимость. За исключением, конечно, питона.

Ex. json_parser {field1} {field2}будет работать print myjson['{field1}']['{field2}'], выдавая либо ключи, либо значения, связанные с {field2}, разделенные пробелами.

Аарон Р.
источник
0

Я только что создал jkid , небольшой обозреватель json в командной строке, который я сделал для легкого изучения больших объектов json. Объекты можно исследовать «трансверсально», и есть опция «предварительного просмотра», чтобы избежать переполнения консоли.

$  echo '{"john":{"size":20, "eyes":"green"}, "bob":{"size":30, "eyes":"brown"}}' > test3.json
$  jkid . eyes test3.json 
object[.]["eyes"]
{
  "bob": "brown", 
  "john": "green"
}
Артур
источник
Как установить jkidна Mac?
user227666