Это делается путем делегирования событий. Событие будет привязываться к элементу-оболочке, но будет делегировано элементу селекторного класса. Вот как это работает.
$('.wrapper-class').on("click", '.selector-class', function() {
// Your code here
});
Элемент-оболочка-оболочка может быть любым ex. документа, тела или вашей обертки. Упаковщик должен уже существовать.
Существует ряд инструментов, специально предназначенных для управления JSON из командной строки, и будет намного проще и надежнее, чем делать с Awk, например jq
:
curl -s 'https://api.github.com/users/lambda' | jq -r '.name'
Вы также можете сделать это с помощью инструментов, которые, вероятно, уже установлены в вашей системе, например Python, с помощью модуля json
, и поэтому избегайте любых дополнительных зависимостей, в то время как по-прежнему пользуясь надлежащим парсером JSON. Далее предполагается, что вы хотите использовать UTF-8, который должен быть закодирован в оригинальном JSON, и это то, что используют большинство современных терминалов:
Python 2:
export PYTHONIOENCODING=utf8
curl -s 'https://api.github.com/users/lambda' | \
python -c "import sys, json; print json.load(sys.stdin)['name']"
Python 3:
curl -s 'https://api.github.com/users/lambda' | \
python3 -c "import sys, json; print(json.load(sys.stdin)['name'])"
Этот ответ первоначально рекомендовал jsawk , который все равно должен работать, но немного более громоздким в использовании, чем jq
и зависит от установленного автономного интерпретатора JavaScript, который менее распространен, чем интерпретатор Python, поэтому предпочтительные ответы, вероятно, предпочтительнее:
curl -s 'https://api.github.com/users/lambda' | jsawk -a 'return this.name'
Этот ответ также изначально использовал API Twitter из вопроса, но этот API больше не работает, что затрудняет копирование примеров для тестирования, а новый API Twitter требует API-ключей, поэтому я переключился на использование API GitHub, который можно легко использовать без ключей API. Первый ответ на исходный вопрос:
curl 'http://twitter.com/users/username.json' | jq -r '.text'
Двухстрочный, который использует python. Он работает особенно хорошо, если вы пишете один файл .sh, и вы не хотите зависеть от другого .py-файла. Он также использует использование трубы |
. echo "{\"field\": \"value\"}"
можно заменить чем-либо, печатающим json на stdout.
echo "{\"field\": \"value\"}" | python -c 'import sys, json
print(json.load(sys.stdin)["field"])'
Если в системе доступно [f 3], то:
$ pip install json-query
Примеры использования:
$ curl -s http://0/file.json | json-query
{
"key":"value"
}
$ curl -s http://0/file.json | json-query my.key
value
$ curl -s http://0/file.json | json-query my.keys.
key_1
key_2
key_3
$ curl -s http://0/file.json | json-query my.keys.2
value_2
Кто-то, у кого также есть xml-файлы, может захотеть посмотреть на мой Xidel . Это беспроигрышный процессор JSONiq . (т. е. он также поддерживает XQuery для обработки xml или json)
Пример в вопросе:
xidel -e 'json("http://twitter.com/users/username.json")("name")'
Или с моим собственным, нестандартным синтаксисом расширения:
xidel -e 'json("http://twitter.com/users/username.json").name'
TickTick является парсером JSON, написанным в bash (& lt; 250 строк кода)
Вот фрагмент автора из его статьи, Представьте мир, в котором поддерживает Bash JSON :
#!/bin/bash
. ticktick.sh
``
people = {
"Writers": [
"Rod Serling",
"Charles Beaumont",
"Richard Matheson"
],
"Cast": {
"Rod Serling": { "Episodes": 156 },
"Martin Landau": { "Episodes": 2 },
"William Shatner": { "Episodes": 2 }
}
}
``
function printDirectors() {
echo " The ``people.Directors.length()`` Directors are:"
for director in ``people.Directors.items()``; do
printf " - %s\n" ${!director}
done
}
`` people.Directors = [ "John Brahm", "Douglas Heyes" ] ``
printDirectors
newDirector="Lamont Johnson"
`` people.Directors.push($newDirector) ``
printDirectors
echo "Shifted: "``people.Directors.shift()``
printDirectors
echo "Popped: "``people.Directors.pop()``
printDirectors
К сожалению, главный проголосовавший ответ, который использует grep
, возвращает полное совпадение, которое не работает в моем сценарии, но если вы знаете, что формат JSON останется постоянным, вы можете использовать lookbehind и lookahead , чтобы извлечь только нужные значения.
# echo '{"TotalPages":33,"FooBar":"he\"llo","anotherValue":100}' | grep -Po '(?<="FooBar":")(.*?)(?=",)'
he\"llo
# echo '{"TotalPages":33,"FooBar":"he\"llo","anotherValue":100}' | grep -Po '(?<="TotalPages":)(.*?)(?=,)'
33
# echo '{"TotalPages":33,"FooBar":"he\"llo","anotherValue":100}' | grep -Po '(?<="anotherValue":)(.*?)(?=})'
100
Вы спросили, как стрелять в ногу, и я здесь, чтобы предоставить боеприпасы:
curl -s 'http://twitter.com/users/username.json' | sed -e 's/[{}]/''/g' | awk -v RS=',"' -F: '/^text/ {print $2}'
Вместо sed
вы можете использовать tr -d '{}'
. Но оставляя их полностью, кажется, тоже имеет желаемый эффект.
Если вы хотите удалить внешние кавычки, проведите результат выше через sed 's/\(^"\|"$\)//g'
Я думаю другие озвучивали достаточную тревогу. Я буду стоять рядом с мобильным телефоном, чтобы вызвать скорую. Пожар при готовности.
Я использовал это для извлечения длительности видео с выхода ffprobe json:
MOVIE_INFO=`ffprobe "path/to/movie.mp4" -show_streams -show_format -print_format json -v quiet`
MOVIE_SECONDS=`echo "$MOVIE_INFO"|grep -w \"duration\" |tail -1 | cut -d\" -f4 |cut -d \. -f 1`
его можно использовать для извлечения значения из любого json:
value=`echo "$jsondata"|grep -w \"key_name\" |tail -1 | cut -d\" -f4
Используйте поддержку JSON Python вместо использования awk!
Что-то вроде этого:
curl -s http://twitter.com/users/username.json | \
python -c "import json,sys;obj=json.load(sys.stdin);print obj['name'];"
json.load(sys.stdin)['"key']"
в качестве примера, например: curl -sL httpbin.org/ip | python -c "import json,sys; print json.load(sys.stdin)['origin']"
.
– erm3nda
15 February 2016 в 08:23
здесь вы можете сделать это с помощью awk
curl -sL 'http://twitter.com/users/username.json' | awk -F"," -v k="text" '{
gsub(/{|}/,"")
for(i=1;i<=NF;i++){
if ( $i ~ k ){
print $i
}
}
}'
Если кто-то просто хочет извлечь значения из простых объектов JSON без необходимости вложенных структур, можно использовать регулярные выражения, даже не выходя из bash.
Вот функция, которую я определил с помощью bash regular выражения, основанные на стандарте JSON :
function json_extract() {
local key=$1
local json=$2
local string_regex='"([^"\]|\\.)*"'
local number_regex='-?(0|[1-9][0-9]*)(\.[0-9]+)?([eE][+-]?[0-9]+)?'
local value_regex="${string_regex}|${number_regex}|true|false|null"
local pair_regex="\"${key}\"[[:space:]]*:[[:space:]]*(${value_regex})"
if [[ ${json} =~ ${pair_regex} ]]; then
echo $(sed 's/^"\|"$//g' <<< "${BASH_REMATCH[1]}")
else
return 1
fi
}
Предостережения: объекты и массивы не поддерживаются как значение, но поддерживаются все другие типы значений, определенные в стандарте. Кроме того, пара будет сопоставляться независимо от того, насколько глубоко в документе JSON она сохраняется до тех пор, пока она имеет точно такое же имя ключа.
Используя пример OP:
$ json_extract text "$(curl 'http://twitter.com/users/username.json')"
My status
$ json_extract friends_count "$(curl 'http://twitter.com/users/username.json')"
245
Niet - это инструмент, который поможет вам извлечь данные из json или yaml-файла непосредственно в ваш CLI оболочки / bash.
$ pip install niet
Рассмотрим json-файл с именем project. json со следующим содержимым:
{
project: {
meta: {
name: project-sample
}
}
Вы можете использовать niet следующим образом:
$ PROJECT_NAME=$(niet project.json project.meta.name)
$ echo ${PROJECT_NAME}
project-sample
Вы можете попробовать что-то вроде этого -
curl -s 'http://twitter.com/users/jaypalsingh.json' |
awk -F=":" -v RS="," '$1~/"text"/ {print}'
Чтобы быстро извлечь значения для определенного ключа, мне лично нравится использовать «grep -o», который возвращает только соответствие регулярному выражению. Например, чтобы получить поле «текст» из твитов, например:
grep -Po '"text":.*?[^\\]",' tweets.json
Это регулярное выражение более надежное, чем вы думаете; например, он отлично разбирается со строками, имеющими встроенные запятые и скрытыми кавычками внутри них. Я думаю, что с немного дополнительной работой вы могли бы создать тот, который на самом деле гарантированно извлекает значение, если он является атомарным. (Если у него есть вложение, то регулярное выражение не может этого сделать, конечно.)
И для дальнейшей очистки (хотя и сохранения исходного экранирования строки) вы можете использовать что-то вроде: | perl -pe 's/"text"://; s/^"//; s/",$//'
. (Я сделал это для этого анализа .)
Для всех ненавистников, которые настаивают, что вы должны использовать настоящий парсер JSON - да, это важно для правильности, но
grep -o
на порядок быстрее, чем стандартная библиотека json
Python, по крайней мере, когда это делается для твитов (которые составляют ~ 2 КБ каждый). Я не уверен, что это происходит только потому, что json
медленный (я должен иногда сравнивать с yajl); но в принципе, регулярное выражение должно быть быстрее, поскольку оно является конечным состоянием и гораздо более оптимизированным, а не парсером, который должен поддерживать рекурсию, и в этом случае тратит много деревьев на сборку зданий для структур, которые вам не нужны. (Если кто-то написал конечный преобразователь состояния, который сделал правильный (ограниченный глубиной) JSON-анализ, это было бы фантастично! Тем временем у нас есть «grep -o».) кода, я всегда использую настоящую парсинговую библиотеку. Я не пробовал jsawk , но если он работает хорошо, это касается точки № 1.
Последнее, более wackier, решение: я написал скрипт, который использует Python json
и извлекает нужные вам ключи, в столбцы, разделенные вкладками; затем я прохожу через обертку вокруг awk
, которая позволяет именованный доступ к столбцам. Здесь: скрипты json2tsv и tvvawk . Таким образом, для этого примера это будет:
json2tsv id text < tweets.json | tsvawk '{print "tweet " $id " is: " $text}'
Этот подход не относится к №2, более неэффективен, чем один скрипт Python, и он немного хрупкий: он принудительно нормализует новые строки и вкладки в строковые значения, чтобы играть хорошо с полем awk / разделенным на запись видом мира. Но это позволяет вам оставаться в командной строке с большей точностью, чем grep -o
.
jq .name
работает в командной строке и не требует «открытия редактора для написания сценария». 2. Неважно, насколько быстро ваше регулярное выражение может вывести результаты wrong i>
– jfs
24 August 2014 в 21:50
| grep -Po '"text":.*?[^\\]",'|awk -F':' '{print $2}'
– JeffCharter
6 September 2015 в 19:37
-P
. Я тестировал на OSX 10.11.5, а grep --version
был grep (BSD grep) 2.5.1-FreeBSD
. Я получил его, работая с расширенным регулярным выражением & quot; в OSX. Команда сверху будет grep -Eo '"text":.*?[^\\]",' tweets.json
.
– Jens
8 June 2016 в 13:14
Вы можете просто загрузить jq
двоичный файл для вашей платформы и запустить (chmod +x jq
):
$ curl 'https://twitter.com/users/username.json' | ./jq -r '.name'
Он извлекает атрибут "name"
из объекта json.
jq
homepage говорит, что это похоже на sed
для данных JSON.
curl -s https://api.example.com/jobs | jq '.jobs[] | {id, o: .owner.username, dateCreated, s: .status.state}'
– jbyler
21 April 2014 в 23:04
Создайте функцию bash в вашем файле .bash_rc
function getJsonVal () {
python -c "import json,sys;sys.stdout.write(json.dumps(json.load(sys.stdin)$1))";
}
Затем
$ curl 'http://twitter.com/users/username.json' | getJsonVal "['text']"
My status
$
Вот такая же функция, но с проверкой ошибок.
function getJsonVal() {
if [ \( $# -ne 1 \) -o \( -t 0 \) ]; then
cat <<EOF
Usage: getJsonVal 'key' < /tmp/
-- or --
cat /tmp/input | getJsonVal 'key'
EOF
return;
fi;
python -c "import json,sys;sys.stdout.write(json.dumps(json.load(sys.stdin)$1))";
}
Где $ # -ne 1 обеспечивает как минимум 1 вход, а -t 0 убедитесь, что вы перенаправляетесь из канала.
Приятное вещь об этой реализации заключается в том, что вы можете получить доступ к вложенным значениям json и получить json взамен! =)
Пример:
$ echo '{"foo": {"bar": "baz", "a": [1,2,3]}}' | getJsonVal "['foo']['a'][1]"
2
Если вы хотите быть действительно фантастическим, вы могли бы довольно распечатать данные:
function getJsonVal () {
python -c "import json,sys;sys.stdout.write(json.dumps(json.load(sys.stdin)$1, sort_keys=True, indent=4))";
}
$ echo '{"foo": {"bar": "baz", "a": [1,2,3]}}' | getJsonVal "['foo']"
{
"a": [
1,
2,
3
],
"bar": "baz"
}
cat
– tripleee
19 February 2014 в 07:17
curl http://foo | python -c 'import json,sys;obj=json.load(sys.stdin);print obj["environment"][0]["name"]'
– Cheeso
4 June 2014 в 01:53
sys.stdout.write()
, если вы хотите, чтобы он работал как с python 2, так и с 3.
– Per Johansson
27 June 2014 в 10:17
getJsonVal() { py -x "json.dumps(json.loads(x)$1, sort_keys=True, indent=4)"; }
– Joe Heyming
22 September 2016 в 22:57
Вы можете использовать jshon
:
curl 'http://twitter.com/users/username.json' | jshon -e text
Версия Native Bash: также хорошо работает с обратными косыми чертами (\) и кавычками (")
function parse_json()
{
echo $1 | \
sed -e 's/[{}]/''/g' | \
sed -e 's/", "/'\",\"'/g' | \
sed -e 's/" ,"/'\",\"'/g' | \
sed -e 's/" , "/'\",\"'/g' | \
sed -e 's/","/'\"---SEPERATOR---\"'/g' | \
awk -F=':' -v RS='---SEPERATOR---' "\$1~/\"$2\"/ {print}" | \
sed -e "s/\"$2\"://" | \
tr -d "\n\t" | \
sed -e 's/\\"/"/g' | \
sed -e 's/\\\\/\\/g' | \
sed -e 's/^[ \t]*//g' | \
sed -e 's/^"//' -e 's/"$//'
}
parse_json '{"username":"john, doe","email":"john@doe.com"}' username
parse_json '{"username":"john doe","email":"john@doe.com"}' email
--- outputs ---
john, doe
johh@doe.com
Разбор JSON болезнен в сценарии оболочки. С помощью более подходящего языка создайте инструмент, который извлекает атрибуты JSON в соответствии с соглашениями об использовании сценариев оболочки. Вы можете использовать свой новый инструмент для решения непосредственной проблемы с сценарием оболочки, а затем добавить его в свой комплект для будущих ситуаций.
Например, рассмотрите инструмент jsonlookup , чтобы, если я скажу jsonlookup access token id
он вернет атрибут id , определенный в атрибуте токен , определенный в атрибуте access из stdin, который, по-видимому, является данными JSON. Если атрибут не существует, инструмент ничего не возвращает (статус выхода 1). Если синтаксический анализ не выполняется, выйдите из состояния 2 и передайте сообщение stderr. Если поиск завершен, инструмент печатает значение атрибута.
Создав инструмент unix для точной цели извлечения значений JSON, вы можете легко использовать его в сценариях оболочки:
access_token=$(curl <some horrible crap> | jsonlookup access token id)
Любой язык будет использоваться для реализации jsonlookup . Вот довольно краткая версия python:
#!/usr/bin/python
import sys
import json
try: rep = json.loads(sys.stdin.read())
except:
sys.stderr.write(sys.argv[0] + ": unable to parse JSON from stdin\n")
sys.exit(2)
for key in sys.argv[1:]:
if key not in rep:
sys.exit(1)
rep = rep[key]
print rep
Следуя указаниям MartinR и Boecko:
$ curl -s 'http://twitter.com/users/username.json' | python -mjson.tool
Это даст вам очень дружелюбный результат. Очень удобно:
$ curl -s 'http://twitter.com/users/username.json' | python -mjson.tool | grep my_key
| grep field
. Благодаря!
– Andrea Richiardi
12 May 2013 в 05:31
curl 'http://twitter.com/users/username.json' | py --json_input -x 'x.name'
– RussellStewart
14 September 2014 в 21:14
Вот хорошая ссылка . В этом случае:
curl 'http://twitter.com/users/username.json' | sed -e 's/[{}]/''/g' | awk -v k="text" '{n=split($0,a,","); for (i=1; i<=n; i++) { where = match(a[i], /\"text\"/); if(where) {print a[i]} } }'
sed
не должно получать больше.
– tripleee
18 June 2018 в 13:00
Возможно, вне темы, но поскольку приоритет царит, этот вопрос остается неполным без упоминания нашего надежного и верного PHP, я прав?
Используя тот же пример JSON, но давайте присваиваем его переменной для уменьшения неопределенности.
$ export JSON='{"hostname":"test","domainname":"example.com"}'
Теперь для корректности PHP, используя file_get_contents и php: // stdin обтекатель потоков.
$ echo $JSON|php -r 'echo json_decode(file_get_contents("php://stdin"))->hostname;'
или как указано с помощью fgets и уже открытого потока при константе CLI STDIN .
$ echo $JSON|php -r 'echo json_decode(fgets(STDIN))->hostname;'
NJoy!
$argn
работает с флагом -E или -R, и только если содержимое JSON находится в одной строке ...
– IcanDivideBy0
23 September 2013 в 12:58
Это хороший прецедент для pythonpy :
curl 'http://twitter.com/users/username.json' | py 'json.load(sys.stdin)["name"]'
Для более сложного разбора JSON я предлагаю использовать python jsonpath module (by Stefan Goessner) -
sudo easy_install -U jsonpath
Пример file.json (из http://goessner.net/articles/JsonPath ) -
{ "store": {
"book": [
{ "category": "reference",
"author": "Nigel Rees",
"title": "Sayings of the Century",
"price": 8.95
},
{ "category": "fiction",
"author": "Evelyn Waugh",
"title": "Sword of Honour",
"price": 12.99
},
{ "category": "fiction",
"author": "Herman Melville",
"title": "Moby Dick",
"isbn": "0-553-21311-3",
"price": 8.99
},
{ "category": "fiction",
"author": "J. R. R. Tolkien",
"title": "The Lord of the Rings",
"isbn": "0-395-19395-8",
"price": 22.99
}
],
"bicycle": {
"color": "red",
"price": 19.95
}
}
}
Разберите его (извлеките все названия книг с ценой & lt; 10) -
$ cat file.json | python -c "import sys, json, jsonpath; print '\n'.join(jsonpath.jsonpath(json.load(sys.stdin), 'store.book[?(@.price < 10)].title'))"
Выведет -
Sayings of the Century
Moby Dick
ПРИМЕЧАНИЕ. командная строка не включает проверку ошибок. для полного решения с проверкой ошибок вы должны создать небольшой скрипт python и обернуть код с помощью try-except.
jsonpath
, поэтому была установлена jsonpath_rw
, поэтому вот что-то похожее вы можете попробовать, если выше не работает: 1) /usr/bin/python -m pip install jsonpath-rw
2) cat ~/trash/file.json | /usr/bin/python -c "from jsonpath_rw import jsonpath, parse; import sys,json; jsonpath_expr = parse('store.book[0]'); out = [match.value for match in jsonpath_expr.find(json.load(sys.stdin))]; print out;"
(я использовал полный путь к двоичный код python, потому что у меня возникли проблемы с несколькими установленными питонами).
– Sridhar-Sarnobat
20 August 2016 в 05:27
Версия, которая использует Ruby и http://flori.github.com/json/
$ < file.json ruby -e "require 'rubygems'; require 'json'; puts JSON.pretty_generate(JSON[STDIN.read]);"
или более кратко:
$ < file.json ruby -r rubygems -r json -e "puts JSON.pretty_generate(JSON[STDIN.read]);"
;
не требуется в Ruby (он используется только для конкатенации операторов, которые обычно находятся на отдельных строках в одну строку).
– Zack Morris
15 August 2018 в 20:50
Это еще один bash
& amp; python
гибридный ответ. Я опубликовал этот ответ, потому что хотел обработать более сложный вывод JSON, но, уменьшив сложность моего приложения bash. Я хочу открыть следующий объект JSON из http://www.arcgis.com/sharing/rest/info?f=json в bash
:
{
"owningSystemUrl": "http://www.arcgis.com",
"authInfo": {
"tokenServicesUrl": "https://www.arcgis.com/sharing/rest/generateToken",
"isTokenBasedSecurity": true
}
}
Несмотря на то, что этот подход увеличивает сложность функции Python, использование bash упрощается:
function jsonGet {
python -c 'import json,sys
o=json.load(sys.stdin)
k="'$1'"
if k != "":
for a in k.split("."):
if isinstance(o, dict):
o=o[a] if a in o else ""
elif isinstance(o, list):
if a == "length":
o=str(len(o))
elif a == "join":
o=",".join(o)
else:
o=o[int(a)]
else:
o=""
if isinstance(o, str) or isinstance(o, unicode):
print o
else:
print json.dumps(o)
'
}
curl -s http://www.arcgis.com/sharing/rest/info?f=json | jsonGet
curl -s http://www.arcgis.com/sharing/rest/info?f=json | jsonGet authInfo
curl -s http://www.arcgis.com/sharing/rest/info?f=json | jsonGet authInfo.tokenServicesUrl
Вывод вышеупомянутого скрипта:
Я добавил поддержку массивов, поэтому вы можете использовать .length
, и если источник представляет собой строковый массив, вы можете использовать .join
:
curl -s http://www.arcgis.com/sharing/rest/portals/self?f=pjson | jsonGet defaultBasemap.baseMapLayers.length
curl -s http://www.arcgis.com/sharing/rest/portals/self?f=pjson | jsonGet defaultBasemap.baseMapLayers.0.resourceInfo.tileInfo.lods
curl -s http://www.arcgis.com/sharing/rest/portals/self?f=pjson | jsonGet defaultBasemap.baseMapLayers.0.resourceInfo.tileInfo.lods.length
curl -s http://www.arcgis.com/sharing/rest/portals/self?f=pjson | jsonGet defaultBasemap.baseMapLayers.0.resourceInfo.tileInfo.lods.23
Какие выходы:
На основании того, что некоторые из рекомендаций здесь (esp в комментариях) предложили использовать Python, я был разочарован, чтобы не найти пример.
Итак, вот один лайнер, чтобы получить один значение из некоторых данных JSON. Предполагается, что вы передаете данные в (откуда-то) и поэтому должны быть полезны в контексте сценариев.
echo '{"hostname":"test","domainname":"example.com"}' | python -c 'import json,sys;obj=json.load(sys.stdin);print obj[0]["hostname"]'
pythonpy
( github.com/russell91/pythonpy почти всегда является лучшей альтернативой python -c
, хотя он должен быть установлен с помощью pip. просто подключите json к py --ji -x 'x[0]["hostname"]'
. не хотели использовать встроенную поддержку json_input, вы все равно можете автоматически импортировать этот импорт как py 'json.loads(sys.stdin)[0]["hostname"]'
– RussellStewart
14 September 2014 в 21:18
jsonq() { python -c "import sys,json; obj=json.load(sys.stdin); print($1)"; }
, чтобы я мог написать: curl ...... | jsonq 'json.dumps([key["token"] for key in obj], indent=2)'
& amp; больше подобных страшных вещей ... Btw, obj[0]
кажется ненужным, похоже, что только obj
работает нормально в случаях по умолчанию (?).
– akavel
23 March 2015 в 14:05
jsonq() { python -c "import sys,json; obj=json.load(sys.stdin); sys.stdout.write(json.dumps($1))"; }
– Adam K Dean
1 March 2016 в 18:58
obj[0]
вызывает ошибку при разборе { "port":5555 }
. Прекрасно работает после удаления [0]
.
– CyberEd
16 August 2016 в 20:49
Теперь, когда Powershell - это кросс-платформа, я подумал, что я брошу туда, потому что считаю это довольно интуитивным и чрезвычайно простым.
curl -s 'https://api.github.com/users/lambda' | ConvertFrom-Json
ConvertFrom-Json преобразует JSON в пользовательский объект Powershell, поэтому вы можете легко работать со свойствами с этой точки вперед. Если вы хотели бы только свойство id, вы бы просто сделали это:
curl -s 'https://api.github.com/users/lambda' | ConvertFrom-Json | select -ExpandProperty id
Если вы хотите вызвать все это из Bash, тогда вам придется называть его как это:
powershell 'curl -s "https://api.github.com/users/lambda" | ConvertFrom-Json'
Конечно, есть чистый способ Powershell сделать это без завитки, что было бы:
Invoke-WebRequest 'https://api.github.com/users/lambda' | select -ExpandProperty Content | ConvertFrom-Json
Наконец, есть также «ConvertTo-Json», который преобразует пользовательский объект для JSON так же легко. Вот пример:
(New-Object PsObject -Property @{ Name = "Tester"; SomeList = @('one','two','three')}) | ConvertTo-Json
Что создавало бы хороший JSON вот так:
{
"Name": "Tester",
"SomeList": [
"one",
"two",
"three"
]
}
По общему признанию, использование оболочки Windows в Unix несколько кощунственный, но Powershell действительно хорош в некоторых вещах, и парсинг JSON и XML - это пара из них. Это страница GitHub для кросс-платформенной версии https://github.com/PowerShell/PowerShell
Если у вас есть php:
php -r 'var_export(json_decode(`curl http://twitter.com/users/username.json`, 1));'
Например: у нас есть ресурс, который предоставляет json странам iso-коды: http://country.io/iso3.json и мы можем легко увидеть его в оболочке с curl:
curl http://country.io/iso3.json
, но она выглядит не очень удобной и не читаемой, лучше разобрать json и увидеть читаемую структуру:
php -r 'var_export(json_decode(`curl http://country.io/iso3.json`, 1));'
Этот код напечатает что-то вроде:
array (
'BD' => 'BGD',
'BE' => 'BEL',
'BF' => 'BFA',
'BG' => 'BGR',
'BA' => 'BIH',
'BB' => 'BRB',
'WF' => 'WLF',
'BL' => 'BLM',
...
, если у вас есть вложенные массивы, этот вывод будет выглядеть намного лучше ...
Надеюсь, это поможет ...
Если система имеет узел , возможно использовать -p
print и -e
флаги сценария evaulate с JSON.parse
, чтобы вытащить любое требуемое значение.
Простой пример с использованием строки JSON { "foo": "bar" }
и вытаскивание значения «foo»:
$ node -pe 'JSON.parse(process.argv[1]).foo' '{ "foo": "bar" }'
bar
] Поскольку у нас есть доступ к cat
и другим утилитам, мы можем использовать это для файлов:
$ node -pe 'JSON.parse(process.argv[1]).foo' "$(cat foobar.json)"
bar
Или любой другой формат, такой как URL-адрес, содержащий JSON:
$ node -pe 'JSON.parse(process.argv[1]).name' "$(curl -s https://api.github.com/users/trevorsenior)"
Trevor Senior
node -p -e 'JSON.parse(process.argv[1]).foo' '{ "foo": "bar" }'
– Rnd_d
26 November 2013 в 01:02
curl -s https://api.github.com/users/trevorsenior | node -pe "JSON.parse(require('fs').readFileSync('/dev/stdin').toString()).name"
– nicerobot
7 May 2014 в 20:19
jq
- хорошая альтернатива – thrau 28 February 2016 в 20:20