一尘不染

使用Unix工具解析JSON

json

我正在尝试解析从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=text)?


阅读 230

收藏
2020-07-27

共1个答案

一尘不染

有许多专门用于从命令行操作JSON的工具,它们比使用Awk进行操作要容易和可靠得多,例如jq

curl -s 'https://api.github.com/users/lambda' | jq -r '.name'

您还可以使用系统上可能已经安装的工具(例如使用json模块的
Python)来执行此操作,从而避免任何额外的依赖关系,同时仍然可以使用适当的JSON解析器。以下假设您要使用UTF-8,原始JSON应该用UTF-8编码,这也是大多数现代终端所使用的:

Python 3:

curl -s 'https://api.github.com/users/lambda' | \
    python3 -c "import sys, json; print(json.load(sys.stdin)['name'])"

Python 2:

export PYTHONIOENCODING=utf8
curl -s 'https://api.github.com/users/lambda' | \
    python2 -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'

这个答案最初也使用了问题中的Twitter API,但是该API不再起作用,因此很难复制示例进行测试,而新的Twitter
API需要API密钥,因此我改用了GitHub API无需API密钥即可轻松使用。原始问题的第一个答案是:

curl 'http://twitter.com/users/username.json' | jq -r '.text'
2020-07-27