使用 Shell 脚本来处理 JSON

举报
隔壁老汪 发表于 2022/06/26 00:52:05 2022/06/26
【摘要】 https://www.tomczhen.com/2017/10/15/parsing-json-with-shell-script/   使用 Shell 脚本来处理 JSON,有以下三种方法: 使用 awk sed使用第三方库调用其他脚本解释器 JSON(JavaScript Object ...

https://www.tomczhen.com/2017/10/15/parsing-json-with-shell-script/

 

使用 Shell 脚本来处理 JSON,有以下三种方法:

  • 使用 awk sed
  • 使用第三方库
  • 调用其他脚本解释器

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programming LanguageStandard ECMA-262 3rd Edition - December 1999 的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 这些特性使JSON成为理想的数据交换语言。

来源:http://json.org/json-zh.html

以 http://ip.taobao.com/service/getIpInfo.php?ip=myip 接口为例,返回的 JSON 数据格式为:


  
  1. {
  2. "code": 0,
  3. "data": {
  4. "country": "中国",
  5. "country_id": "CN",
  6. "area": "华南",
  7. "area_id": "800000",
  8. "region": "广东省",
  9. "region_id": "440000",
  10. "city": "深圳市",
  11. "city_id": "440300",
  12. "county": "",
  13. "county_id": "-1",
  14. "isp": "电信",
  15. "isp_id": "100017",
  16. "ip": "113.104.182.107"
  17. }
  18. }

使用内置命令处理

使用内置的 awk sed 来获取指定的 JSON 键值。


  
  1. function get_json_value()
  2. {
  3. local json=$1
  4. local key=$2
  5. if [[ -z "$3" ]]; then
  6. local num=1
  7. else
  8. local num=$3
  9. fi
  10. local value=$(echo "${json}" | awk -F"[,:}]" '{for(i=1;i<=NF;i++){if($i~/'${key}'\042/){print $(i+1)}}}' | tr -d '"' | sed -n ${num}p)
  11. echo ${value}
  12. }

使用下面的方式可以获得 ip 的值:

get_json_value $(curl -s http://ip.taobao.com/service/getIpInfo.php?ip=myip) ip

 

使用内置命令的优点是无需额外的依赖,缺点是有些 JSON 格式无法正常获取,需要根据实际情况修改相关的正则或命令参数。

例如,以上脚本获取 data 字段时就会有问题:

get_json_value $(curl -s http://ip.taobao.com/service/getIpInfo.php?ip=myip) data

 

会返回以下结果:

{country

 

另外脚本并没有转码功能,所以获取中文值时输出的仍然是原编码,例如获取 isp 字段:

get_json_value $(curl -s http://ip.taobao.com/service/getIpInfo.php?ip=myip) isp

 

会返回以下结果:

\u7535\u4fe1

 

使用第三方库处理

jq is like sed for JSON data - you can use it to slice and filter and map and transform structured data with the same ease that sed, awk, grep and friends let you play with text.

来源:https://stedolan.github.io/jq/

jq 与 sed 类似,但是对于处理 JSON 更加友好、方便。由于是第三方库,所以需要单独安装或添加二进制文件到 PATH 路径下。不过 jq 本身是可以跨平台并且单文件即可运行,也很方便。

通过下面的命令可以获得返回的 JSON 数据:

curl -s http://ip.taobao.com/service/getIpInfo.php?ip=myip | jq '.'

 

如果需要单独获得 ip 的值,只需要修改 jq 的参数即可:

curl -s http://ip.taobao.com/service/getIpInfo.php?ip=myip | jq '.data.ip'

 

更多用法可以查看 jq 的手册 https://stedolan.github.io/jq/manual/

调用其他脚本解释器

虽然 bash/sh 没有专门处理 JSON 的功能,但是其他脚本解释器通常都是有的,比如 Python、PHP 或者 Ruby,甚至 JavaScript 也可以。

注:PHP 需要有 PHP CLI,JavaScript 需要有 Node。

以 Python 为例获取 ip 的值:

  • Python 2

  
  1. export PYTHONIOENCODING=utf8
  2. curl -s 'http://ip.taobao.com/service/getIpInfo.php?ip=myip' | \
  3. python -c "import sys, json; print json.load(sys.stdin)['data']['ip']"
  • Python 3

  
  1. curl -s 'http://ip.taobao.com/service/getIpInfo.php?ip=myip' | \
  2. python3 -c "import sys, json; print(json.load(sys.stdin)['data']['ip'])"

文章来源: blog.csdn.net,作者:隔壁老瓦,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/wxb880114/article/details/117445156

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。