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

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

Ответ 1

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

cpan JSON

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

perl -MData::Dumper -MJSON=from_json -ne'print Dumper(from_json($_))'

Ответ 2

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

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

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

Ответ 3

Если вы ищете переносимый скомпилированный инструмент 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/

Ответ 4

Я создал модуль, специально разработанный для манипуляции 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":

example.png

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

Ответ 5

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

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

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


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

Ответ 6

Оформить заказ 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"]``

Ответ 7

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

https://github.com/keenerd/jshon

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

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

Ответ 8

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

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

Ответ 9

Для 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 [email protected]
    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}, разделенные пробелами.

Ответ 10

Я только что сделал 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"
}