我试图解析从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的后期版本有一个互动模式!-
你有多种选择。
您可以使用trdsql[1]来解析和转换JSON/CSV输入。以你为榜样;
trdsql "select attr1,attr2 from sample.json"
你也可以像SQL一样使用where子句。输出在CSV, JSON等。非常方便的工具。
根据我的经验,trdsql在处理属性嵌套值时有点问题,所以我在适当的时候使用qp[2]找到了一个解决方案。
cat sample.json | qp 'select attr1, attr2.detail.name where attr3=10'
注意这里没有FROM。
为了查看结果,您可以使用超快速命令行json查看器工具jless来查看输出[3]。
Clickhouse来了个新人。您可以从[4]中看到它的功能。
https://github.com/noborus/trdsql
https://jless.io
https://github.com/f5io/qp
https://clickhouse.com/blog/extracting-converting-querying-local-files-with-sql-clickhouse-local
使用PHP CLI解析JSON
这可以说是跑题了,但是由于优先级的原因,如果不提到我们值得信赖和忠诚的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;'