Аналізатор командного рядка Unix JSON? [зачинено]


128

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


Мені подобається використовувати pythonpy ( github.com/russell91/pythonpy ): cat a.json | py --ji -x 'x.attr'
RussellStewart



1
У місті є новий інструмент: ramda-cli , який використовує закручені api Ramda та короткий синтаксис LiveScript. Він побудований для того, щоб приймати json як функції введення та складання. npm install -g ramda-cli
Переконатись

Відповіді:


18

Ви можете використовувати цей аналізатор командного рядка (який ви можете вставити в баш-псевдонім, якщо хочете), використовуючи модулі, вбудовані в ядро ​​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 } )"
Георгій Владимиров

232

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

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

Але слід зазначити, що це буде сортувати всі клавіші в алфавітному порядку, що є або може бути хорошою справою, де json був створений якоюсь мовою, яка використовувала не упорядковані HashMaps ...


5
Занижена відповідь. Це хороша альтернатива командного рядка, якщо мета - перевірити заданий файл JSON як такий, що містить дійсний JSON.
scorpiodawg

10
ця відповідь не описує, як перевірити значення вказаного ключа.
Колін Су

8
@ColinSu, але це також було не первісне питання. json.toolце лише коротка рука для симпатичного друку json. Якщо вам потрібно витягнути / маніпулювати даними json у скрипті оболонки, я б використовував, jqщо є дивним для того, що робить ...
muhqu

@muhqu Так, я знаю, я вживаю json.toolдесять разів на день. Я думаю, що я неправильно прочитав значення "інтроспекції" у питанні, дякую за те, що ви вказали.
Колін Су

1
IMMO - це неправильна відповідь, тому що python json.toolвиконує лише дві речі: перевірку json та симпатичний друк. Він НЕ вводить значення в json, як jqце робить.
Devy

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
Найкраща відповідь тут imo. Ніяких важких залежностей, малої, потужної, хорошої документації та вітерця, щоб спробувати це. Дуже дякую, що запропонували це!
FrozenCow

У Ubuntu / Debian ви можете просто apt install jq.
Пабло А

Я запитав цього багатомісячного тому тому і навчився любити jq.
Черга

63

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

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

  • Гнучка - інструмент "швейцарський армійський ніж" для обробки даних 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 "розумно-білого простору":

Якщо у вас є запити щодо функцій, коментуйте це повідомлення або додайте проблему в github. Буду радий розставити пріоритети для функцій, які потрібні членам спільноти.


Дивовижно! Але чи можна запускати консольні команди на даних JSON? Наприклад: надано файл JSON з масивом URL, wgetкожна URL.
Каміло Мартін

@CamiloMartin - найпростіший спосіб зробити це - роздрукувати URL-адреси, одну URL-адресу на рядок, а потім виконати це через xargs або GNU паралельно.
Дейв Допсон

@DaveDopson Чи можу я використовувати underscoreдля розбору вкладених json, які мають вкладені об’єкти та масиви?
користувач227666

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"]``

Ви повинні любити інструменти рівня оболонки :)
Jé Queue

12

Простий в установці, на 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

pipe json до нього, і він проходить об'єкти json і виводить шлях до поточного об'єкта (як масив JSON), а потім до об'єкта без пробілу.

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


Приклад використання на OSX: brew install jshon,cat *.json | jshon
kenorb

2

Ви можете спробувати jsawk, як пропонується у цій відповіді .

Дійсно, ви можете скористатися швидким сценарієм пітона, щоб це зробити.


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. Можливо, це можна було б адаптувати до смаку.

У будь-якому випадку, щось домашнє для тих, хто не хоче джерела ще в одній зовнішній залежності. За винятком пітона, звичайно.

Вих. 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?
користувач227666
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.