Linux 学习笔记之(八)使用 jq 工具解析 json 字符串
一、背景
在开发当中,为了运行时方便替换代码,有时会直接使用 shell 来进行简单逻辑的开发,在 脚本中 若通过 curl 调用其它服务的 restful 接口,需要对返回的 json 数据进行解析,此时可以 使用 jq 工具方便解析
二、知识
1、安装
jq 官网:https://stedolan.github.io/jq/manual/
(1) 下载二进制文件
下载地址:https://stedolan.github.io/jq/download/
在这里可以选择适配 要安装 linux 操作系统的 jq 版本
我的 linux 操作系统是 arm64 位的,所以选择 了 jq 1.6 binaries for 64-bit
这里可以点击 “ 64-bit” 选择下载,若 linux 操作系统所属服务器是 能够上网的,可以直接使用
wget https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64
jq-linux64 是一个文件,对其进行重命名,叫 jq
(2) 下载源码进行编译安装
(3) 使用 yum 安装
yum install jq
3、基础知识
(1) echo $a | ./jq .
以 json 格式展示 变量 a 中存储的 json 字符串
(2)
三、示例
json 字符串
{ "code":"0", "message":"success", "data":[ { "vip":"10.19.115.188", "groupName":"10.19.115.188-主备", "groupId":0, "nodes":[ { "ipAddress":"10.19.115.202", "haStatus":"master", "runningStatus":"0" }, { "ipAddress":"10.19.115.189", "haStatus":"backup", "runningStatus":"0" } ], "allRunning":"0", "haCorrect":"0" } ] }
(1) echo $a | ./jq .
(2) echo $a|./jq '.data' 返回数组
(3)echo $a|./jq '.data|tostring' 返回字符串 (将 data 的值 数组转为了字符串返回)
(4) echo $a |./jq '.code' 返回字符串
(5) echo $a |./jq '.data[]' 直接返回数组 data 中所有对象,以下截图的结果 中 没有 数组特有的标志 []
(6) 从json格式的文件中解析
data.json 文件内容如下
{ "data": [ { "id": 1, "groupName": "默认分组", "createTime": "2024-07-19T09:00:55.143874", "addComment": "默认分组-请勿删除", "enableFlag": 1, "userId": 1, "tenantCode": "0", "projectCode": "0" } ], "msg": null, "success": true, "code": "0" }
a) 获取code的值
./jq -r '.code' data.json
b) 获取data数据中的每个元素中的
for _group_obj in `./jq -r '.data[]|tojson' data.sjon`;do _gorup_id=`echo $_group_obj|./jq '.id'|sed 's/"//g'` _group_name=`echo $_group_obj|./jq '.groupName'|sed 's/"//g'` echo $_gorup_id:$_group_name done
PS:注意
注意这里的 for 循环中的in,in 后面其实跟着的是数组,如果 通过jq工具分解出来的数据中包含 空格,那么这里会按照 shell 的语法规则按照 IFS 默认的空格+换行符 来对数据进行分割形成数组。 因此需要在 for 循环语句前面 加上
OLD_IFS=$IFS
IFS=$'\n' 更改默认的分隔符,直接按照 换行符进行分割,因此上面的代码调整如下:
OLD_IFS=$IFS IFS="&" for _group_obj in `./jq -r '.data[]|tojson' data.sjon`;do _gorup_id=`echo $_group_obj|./jq '.id'|sed 's/"//g'` _group_name=`echo $_group_obj|./jq '.groupName'|sed 's/"//g'` echo $_gorup_id:$_group_name done IFS=$OLD_IFS
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~