2010-10-04 3 views
109

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

+0

Мне нравится использовать pythonpy (https://github.com/russell91/pythonpy): cat a.json | py -ji -x 'x.attr' – RussellStewart

+0

Связанный: [Инструмент командной строки для разбора входа JSON для Unix?] (http://softwarerecs.s.stackexchange.com/q/19018/3474) на SR – kenorb

+0

См. также [Читать json data в сценарии оболочки] (http://stackoverflow.com/questions/20488315/read-the-json-data-in-shell-script) – koppor

ответ

13

Во-первых, установить модуль JSON из CPAN:

cpan JSON 

Затем вы можете использовать эту командной строки анализатор (который можно положить в Баш псевдоним, если вам нравится):

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

Я смущен результатом этого. Выход включает в себя жирные стрелки (=>) между клавишами и значениями. Это не JSON. –

+6

@landon: нет, вход JSON, а выход - это собственная структура данных Perl, и вы можете продолжить работу, если это необходимо. Точка этого однострочного слоя - это данные, которые намного легче читать. – Ether

1

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

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

+0

Интересно, посмотрим. – Xailor

10

Также есть JSON command line processing toolkit, если в вашем стеке у вас есть node.js и npm.

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

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


по теме: Command line tool for parsing JSON input for Unix?

+0

Простая установка, на Ubuntu: sudo apt-get install python-pip && sudo pip install jsonpipe –

+0

@ divideandconquer.se Извините, но вы устанавливаете этот инструмент, используя npm с 'npm install json'. – rednaw

+0

@rednaw К сожалению, пакет NPM «json», похоже, теперь перехвачен совершенно другим пакетом. – Brad

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

Gotta love tools-level tools :) – Xailor

8

Любое упоминание Jshon или JSON.sh?

https://github.com/keenerd/jshon

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

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

+0

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

60

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

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

  • ГИБКИЙ - "Swiss-армейском нож" инструмент для обработки данных в формате JSON - могут быть использованы как простой симпатичный принтер или в виде полнофункциональной строки Javascript
  • POWERFUL - Предоставляет полную мощность и функциональность underscore.js (плюс underscore.string)
  • SIMPLE - Делает это просто написать JS остротами аналогично использованию «Perl -pe»
  • прикован - Несколько команд invokations могут быть соединены вместе, чтобы создать обработки данных трубопровода
  • Multi- ФОРМАТ - Рич поддержка форматов ввод/вывод - довольно-печать, строгий формат 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. Я был бы рад определить приоритеты функций, которые необходимы членам сообщества.

+0

Удивительный!Но можно ли запускать консольные команды по данным JSON? Например: с учетом файла JSON с массивом URL, 'wget' каждого URL. –

+0

@CamiloMartin - самый простой способ сделать это - распечатать URL-адреса, по одному URL-адресу в строке, а затем запустить через xargs или GNU-параллель. –

+0

@DaveDopson Можно ли использовать 'underscore' для разбора вложенного json с вложенными объектами и массивами? – user227666

203

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

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

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

+5

Недооцененный ответ. Это хорошая альтернатива командной строки, если целью является проверка данного файла JSON как содержащего действительный JSON. – scorpiodawg

+5

В этом ответе не описывается, как проверять значения указанного ключа. –

+8

@ColinSu, но это был не оригинальный вопрос. 'json.tool' - всего лишь короткая рука для красивой печати json. Если вам нужно извлечь/обработать json-данные в сценарии оболочки, я бы использовал 'jq', который является чистым, удивительным в том, что делает ... – muhqu

0

Я просто сделанный jkid, который представляет собой небольшой командной строки json explorer, который я сделал, чтобы легко исследовать большие объекты 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? – user227666

126

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

+18

Лучший ответ здесь imo. Никаких тяжелых зависимостей, небольшой, мощной, хорошей документации и бриза, чтобы попробовать. Большое спасибо за предложение этого! – FrozenCow

+0

На Ubuntu/Debian вы можете просто «apt install jq». –

1

Для Bash/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. Это, вероятно, можно было бы приспособить к вкусу.

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

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

Смежные вопросы