我试图解析从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=文本表示)?
还有一个非常简单但功能强大的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的后期版本有一个互动模式!-
对于更复杂的JSON解析,我建议使用Python jsonpath模块(Stefan Goessner) -
Install it -
sudo easy_install -U jsonpath
Use it -
Example file.json (from 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
}
}
}
Parse it (extract all book titles with price < 10) -
cat file.json | python -c "import sys, json, jsonpath; print '\n'.join(jsonpath.jsonpath(json.load(sys.stdin), 'store.book[?(@.price < 10)].title'))"
Will output -
Sayings of the Century
Moby Dick
Note: The above command line does not include error checking. For a full solution with error checking, you should create a small Python script, and wrap the code with try-except.
使用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
YAML处理器yq
考虑使用yq进行JSON处理。
yq是一个轻量级、可移植的命令行YAML处理器(JSON是YAML的一个子集)。
语法类似于jq。
输入
{
"name": "Angel",
"address": {
"street": "Stairway to",
"city": "Heaven"
}
}
用法举例1
yq e ` .name ` $FILE
Angel
用法举例二
yq有一个很好的内置特性,可以使JSON和YAML成为grep-able
yq——输出格式道具$FILE
name = Angel
address.street = Stairway to
address.city = Heaven
如果你正在寻找一个本地Mac解决方案来解析JSON(没有外部库等…),那么这是为你。
此信息来自https://www.macblog.org/parse-json-command-line-mac/
简而言之,自从Mac OS Yosemite有一个运行苹果脚本的工具叫做osascript,但是如果你传递-l 'Javascript'标志,你可以运行Javascript !这就是所谓的使用JXA (JavaScript for Automation)。
下面是为我自己的项目读取JSON文件的示例。
DCMTK_JSON=$(curl -s https://formulae.brew.sh/api/bottle/dcmtk.json) # -s for silent mode
read -r -d '' JXA <<EOF
function run() {
var json = JSON.parse(\`$DCMTK_JSON\`);
return json.bottles.$2.url;
}
EOF
DOWNLOAD_URL=$( osascript -l 'JavaScript' <<< "${JXA}" )
echo "DOWNLOAD_URL=${DOWNLOAD_URL}"
这里所发生的是我们将函数的输出存储到变量JXA中。然后我们可以使用JSON.parse()简单地运行javascript来解析JSON内容。然后简单地将包含脚本的JXA变量传递给osascript工具,以便它可以运行javascript。在我的例子中,如果测试的话,$2指的是arm64_monterey。javascript立即运行的原因是特殊的run()函数,JXA将查找该函数并在完成时返回其输出。
注意EOF(文件的结尾)用于处理多行文本输入,并且结束的EOF前面不能有任何空格。
您可以通过简单地打开终端并键入下面的命令来测试这是否适合您
osascript -l 'JavaScript' -e 'var app = Application.currentApplication(); app.includeStandardAdditions = true; app.displayDialog("Hello from JavaScript!");
这应该会弹出一个从javascript说hello的窗口