定义结构体并使用json标签处理JSON序列化与反序列化,通过json.Marshal发送POST请求,用json.NewDecoder解析响应,结合net/http包处理状态码与错误,支持嵌套结构与动态字段。

在Golang中处理JSON API请求与响应是构建现代Web服务和客户端调用的常见需求。Go标准库提供了encoding/json、net/http等包,配合结构体标签(struct tags)可以高效地完成序列化与反序列化。以下是常用的处理方法汇总。
处理JSON的第一步是定义Go结构体,使用json:标签来控制字段的序列化行为。
例如,一个用户信息的响应结构:
<strong>type User struct {
ID int `json:"id"`
Name string `json:"name"`
Email string `json:"email,omitempty"`
}</strong>
omitempty表示当Email为空时,该字段不会出现在输出JSON中。这是控制可选字段的重要方式。
向API发送JSON数据通常用于创建或更新资源。需要将结构体编码为JSON,并设置正确的Content-Type头。
示例:发送POST请求创建用户
<strong>user := User{Name: "Alice", Email: "alice@example.com"}
jsonData, _ := json.Marshal(user)
resp, err := http.Post("https://api.example.com/users", "application/json", bytes.NewBuffer(jsonData))
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()</strong>
关键点:
json.Marshal将结构体转为JSON字节流bytes.NewBuffer
Content-Type: application/json(某些API强制要求)从API接收JSON后,通常需要反序列化到结构体中。
示例:读取GET响应并解析
NameGPT
免费的名称生成器,AI驱动在线生成企业名称及Logo
119
查看详情
<strong>resp, err := http.Get("https://api.example.com/users/1")
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
var user User
if err := json.NewDecoder(resp.Body).Decode(&user); err != nil {
log.Fatal(err)
}
fmt.Printf("User: %+v\n", user)</strong>
这里使用json.NewDecoder直接从io.Reader(如resp.Body)解码,适合处理HTTP响应流。
实际API中常有嵌套结构或不确定字段。可通过嵌套结构体或使用map[string]interface{}处理。
例如处理包含元数据的响应:
<strong>type Response struct {
Data User `json:"data"`
Meta map[string]interface{} `json:"meta"`
}</strong>
若字段类型不固定,可用interface{}接收,再通过类型断言提取值:
<strong>if version, ok := response.Meta["version"].(string); ok {
fmt.Println("Version:", version)
}</strong>

不要忽略HTTP状态码。即使请求返回,也可能携带错误信息。
建议做法:
<strong>if resp.StatusCode != http.StatusOK {
var errorResp map[string]string
json.NewDecoder(resp.Body).Decode(&errorResp)
log.Fatal("API error:", errorResp["message"])
}</strong>
很多API在非200状态时仍返回JSON格式错误,应尝试解析并提示用户。
基本上就这些。掌握结构体标签、json.Marshal/Unmarshal、http.Client的基本用法,就能应对大多数JSON API场景。关键是设计好结构体,合理处理空值和错误响应。
以上就是如何在Golang中处理JSON API请求与响应_Golang JSON API请求响应处理方法汇总的详细内容,更多请关注其它相关文章!
相关文章:
微信商城在哪里打开【步骤】
Python Sounddevice 音频卡顿问题解析与队列数据安全处理
Archive of Our Own官网直达 AO3最新可用地址一览
Angular Material 垂直步进器:实现底部到顶部排序的教程
照顾宝贝2小游戏点击立即在线玩
品牌机怎么重装系统 联想/戴尔/惠普笔记本恢复出厂系统教程
J*a里如何使用N*igableMap进行导航操作_可导航Map操作技巧解析
抖音网页版快捷访问 抖音网页版网页版入口操作教程
大麦的“候补”是什么意思 大麦候补购票规则【详解】
win11开机启动修复循环怎么办 Win11无法进入系统高级启动解决方法【修复】
理解Python模块与全局变量的作用域管理
Sublime怎么配置Nim语言环境_Sublime Nim代码高亮与补全
Windows电脑怎么截图最方便_系统自带截图工具的5种神仙用法【技巧】
如何使用Node.js csv 包按条件移除含空字段的CSV记录
J*aScript DOM操作:高效清空列表元素的策略与实践
Go与Ruby之间实现AES加密互通:CFB模式下的密钥长度匹配策略
护手霜蹭到袖口上了如何清洗? 怎样避免留下一圈油印?
Lar*el Excel导入时生成自定义递增ID的策略与实践
德邦快递查询平台 德邦快递物流信息查询入口
Yandex官方入口网址 Yandex俄罗斯搜索引擎最新在线地址
在命令行怎么运行html项目_命令行运行html项目方法【教程】
Composer如何在生产环境安全地执行composer update
poki免费入口快捷访问 poki人气小游戏直接玩站点
如何在网页中实现特定地点的随机图片展示
C++如何连接MySQL数据库_C++使用Connector/C++操作MySQL数据库教程
自定义 WooCommerce 购物车:始终显示全部交叉销售商品
Go Martini框架:动态服务解码后的图片内容
学习通网页版快速入口 学习通官网网页版直接打开
12306选座怎么选到特殊座位_12306特殊座位选择注意事项
《主播少女的秘密账号迷宫》首支宣传片
一加 Nord 5 隐私权限异常_一加 Nord 5 系统安全优化
优化 Python 函数中的条件逻辑:解决 if-else 嵌套与参数选择问题
Composer的 "licenses" 命令如何帮助你遵守开源协议_检查项目依赖的许可证合规性
在PHP脚本中通过SSHFS挂载远程文件系统的最佳实践与常见问题解决
sublime怎么预览Markdown渲染效果_Markdown Preview插件 for sublime教程
yy漫画网页版官方入口_yy漫画官网登录页面链接
探索高级语言到C/C++的转译路径:以Go为例及内存管理策略
C++如何检测键盘输入_C++ _kbhit与_getch函数非阻塞输入
age动漫网站入口 age动漫官网直接访问入口
照顾宝贝2小游戏免费秒玩入口
如何设置Windows Defender的定时扫描_计划任务实现自动杀毒【安全】
写好的html代码怎么运行出来_运行写好的html代码方法【教程】
Go RPC HTTP服务正确实现与常见陷阱解析
mcjs网页版流畅运行 mcjs低配电脑畅玩入口
《铁拳8》黑皮辣妹新实机:元气满满的18岁少女!
Node.js CSV 数据处理:基于字段空值条件过滤整条记录的策略
神经网络二分类模型训练异常:高损失与完美验证准确率的排查与修正
钉钉视频会议画面卡顿如何解决 钉钉会议画面优化方法
移动端XML文件怎么转换成Excel 手机和平板上的解决方案
在Runstone环境中高效处理TasteDive API的JSON数据