我试图解析从curl请求返回的JSON,就像这样:
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++) print a[i]}'
上面将JSON划分为多个字段,例如:
% ...
"geo_enabled":false
"friends_count":245
"profile_text_color":"000000"
"status":"in_reply_to_screen_name":null
"source":"web"
"truncated":false
"text":"My status"
"favorited":false
% ...
我如何打印一个特定的字段(由-v k=文本表示)?
如果你安装了PHP解释器:
php -r 'var_export(json_decode(`curl http://twitter.com/users/username.json`, 1));'
例如:
我们有一个资源,提供JSON内容与国家的ISO代码:http://country.io/iso3.json,我们可以很容易地看到它在一个shell与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',
...
如果你有嵌套数组,这个输出看起来会更好…
使用node . js
如果系统安装了Node.js,则可以在JSON中使用-p print和-e evaluate脚本标志。解析以提取所需的任何值。
一个简单的例子,使用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
或包含JSON的URL等任何其他格式:
node -pe 'JSON.parse(process.argv[1]).name' "$(curl -s https://api.github.com/users/trevorsenior)"
输出:
Trevor Senior
还有一个非常简单但功能强大的JSON CLI处理工具fx。
例子
使用匿名函数:
echo '{"key": "value"}' | fx "x => x.key"
输出:
value
如果你不传递匿名函数参数→…,代码将自动转换为匿名函数。你可以通过这个关键字访问JSON:
$ echo '[1,2,3]' | fx "this.map(x => x * 2)"
[2, 4, 6]
或者也可以使用点语法:
echo '{"items": {"one": 1}}' | fx .items.one
输出:
1
你可以传递任意数量的匿名函数来减少JSON:
echo '{"items": ["one", "two"]}' | fx "this.items" "this[1]"
输出:
two
您可以使用扩展操作符更新现有JSON:
echo '{"count": 0}' | fx "{...this, count: 1}"
输出:
{"count": 1}
只是简单的JavaScript。没有必要学习新的语法。
fx的后期版本有一个互动模式!-
使用Python的JSON支持,而不是使用AWK!
就像这样:
curl -s http://twitter.com/users/username.json | \
python -c "import json,sys;obj=json.load(sys.stdin);print(obj['name']);"
macOS v12.3 (Monterey)删除了/usr/bin/python,因此对于macOS v12.3及更高版本,我们必须使用/usr/bin/python3。
curl -s http://twitter.com/users/username.json | \
python3 -c "import json,sys;obj=json.load(sys.stdin);print(obj['name']);"