Парсер JSON командной строки Unix?

120

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

Показать ещё 2 комментария
Теги:
parsing
configuration

10 ответов

15
Лучший ответ

Сначала установите модуль JSON из CPAN:

cpan JSON

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

perl -MData::Dumper -MJSON=from_json -ne'print Dumper(from_json($_))'
  • 1
    Я смущен результатом этого. Вывод содержит жирные стрелки (=>) между клавишами и значениями. Это не JSON.
  • 6
    @landon: нет, входные данные - это JSON, а выходные данные - это собственная структура данных Perl, которую вы можете затем продолжить, если необходимо. Смысл этого однострочника в том, что он создает данные, которые намного легче читать.
Показать ещё 1 комментарий
224

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

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

Но следует отметить, что это отсортирует все ключи по алфавиту, что хорошо или хорошо, когда json был сгенерирован каким-то языком, который использовал неупорядоченные HashMaps...

  • 5
    Недооцененный ответ. Это хорошая альтернатива командной строки, если цель состоит в том, чтобы проверить заданный файл JSON как содержащий действительный JSON.
  • 8
    этот ответ не описывает, как проверить значения указанного ключа.
Показать ещё 4 комментария
138

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

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

С веб-сайта:

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

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

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

  • 19
    Лучший ответ здесь ИМО. Нет тяжелых зависимостей, небольшой, мощный, хорошая документация и ветерок, чтобы попробовать это. Большое спасибо за предложение этого!
  • 0
    В Ubuntu / Debian вы можете просто apt install jq .
60

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

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

  • FLEXIBLE. Инструмент "swiss-army-knife" для обработки данных JSON - может использоваться как простой симпатичный принтер или как полноценная Javascript-команда.
  • МОЩНЫЙ - предоставляет полную мощность и функциональность underscore.js(плюс underscore.string)
  • ПРОСТОЙ - упрощает запись однострочных JS, аналогичных использованию "perl -pe"
  • CHAINED. Несколько команд-команд можно связать вместе для создания конвейера обработки данных.
  • MULTI-FORMAT. Богатая поддержка форматов ввода/вывода - довольно печатная, строгая JSON и т.д. [скоро]
  • DOCUMENTED - отличная документация по командной строке с несколькими примерами для каждой команды

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

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 "smart-whitespace":

Изображение 3884

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

  • 0
    Потрясающие! Но возможно ли запускать консольные команды для данных JSON? Например: если указан файл JSON с массивом URL, wget каждый URL.
  • 0
    @CamiloMartin - самый простой способ сделать это - распечатать URL-адреса, по одному URL-адресу на строку, а затем запустить их через xargs или GNU параллельно.
Показать ещё 3 комментария
11

Оформить заказ 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"]``
  • 0
    Должен любить инструменты на уровне оболочки :)
11

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

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

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


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

  • 0
    Простота установки в Ubuntu: sudo apt-get install python-pip && sudo pip install jsonpipe
  • 0
    @ divandconquer.se Извините, но вы устанавливаете этот инструмент, используя npm, npm install json .
Показать ещё 1 комментарий
8

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

https://github.com/keenerd/jshon

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

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

  • 0
    Пример использования на OSX: brew install jshon , cat *.json | jshon
2

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

Действительно, вы могли бы разбить быстрый python script, чтобы сделать это, хотя.

  • 0
    Интересно, проверю.
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. Вероятно, он может быть адаптирован к вкусу.

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

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"
}
  • 0
    Как я могу установить jkid в Mac?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню