Go 中嵌套结构体无法序列化为 JSON 的原因及解决方案
发布时间 - 2025-12-26 00:00:00 点击率:次go 的 `json.marshal` 只能序列化导出(首字母大写)的结构体字段,小写开头的字段默认不可见,导致序列化结果为空对象 `{}`。
在 Go 语言中,JSON 序列化依赖于反射机制,而反射仅能访问 已导出(exported)字段——即字段名首字母必须为大写。你提供的代码中,Configitem 和 GuiConfig 的所有字段均以小写字母开头(如 local_address、configs),因此 encoding/json 包在序列化时完全忽略它们,最终输出空 JSON 对象 {}。
✅ 正确做法:将结构体字段改为导出字段(首字母大写),并推荐添加 JSON 标签以控制键名:
type Configitem struct {
LocalAddress string `json:"local_address"`
LocalPort int `json:"local_port"`
Method string `json:"method"`
Password string `json:"password"`
Server string `json:"server"`
ServerPort string `json:"server_port"`
Timeout int `json:"timeout"`
}
type GuiConfig struct {
Configs []*Configitem `json:"configs"`
Index int `json:"index"`
}修改后完整可运行示例:
package main
import (
"encoding/json"
"fmt"
)
type Configitem struct {
LocalAddress string `json:"local_address"`
LocalPort int `json:"local_port"`
Method string `json:"method"`
Password string `json:"password"`
Server string `json:"server"`
ServerPort string `json:"server_port"`
Timeout int `json:"timeout"`
}
type GuiConfig struct {
Configs []*Configitem `json:"configs"`
Index int `json:"index"`
}
func main() {
item1 := &Configitem{
LocalAddress: "eouoeu",
LocalPort: 111,
Method: "eoeoue",
Password: "ouoeu",
Server: "oeuoeu",
ServerPort: "qoeueo",
Timeout: 3333,
}
config1 := &GuiConfig{
Index: 1,
Configs: []*Configitem{item1},
}
data, err := json.Marshal(config1)
if err != nil {
panic(err)
}
fmt.Println(string(data))
// 输出:{"configs":[{"local_address":"eouoeu","local_port":111,"method":"eoeoue","password":"ouoeu","server":"oeuoeu","server_port":"qoeueo","timeout":3333}],"index":1}
}⚠️ 注意事项:
- 即使字段导出,若类型不支持 JSON 编码(如 func、chan、未导出结构体等),仍会报错或跳过;
- 若需保留小写字段名但又不想导出(如封装敏感逻辑),可手动实现 json.Marshaler 接口,自定义序列化逻辑;
- JSON 标签中的 - 表示忽略该字段;omitempty 可在值为空时省略字段(如 json:"name,omitempty");
- 嵌套结构体同样需满足导出规则——子结构体本身类型名也须首字母大写(如 Configitem ✅,configitem ❌)。
总结:Go 的 JSON 序列化严格遵循包可见性规则。“小写 = 私有 = 不可序列化” 是初学者常见陷阱。养成结构体字段首字母大写 + 显式 JSON 标签的习惯,是编写健壮序列化逻辑的基础。
# word
# js
# git
# json
# go
# 编码
# ai
# igs
# 封装
# 结构体
# 接口
# 对象
# 序列化
# 首字母
# 字段名
# 可在
# 自定义
# 不支持
# 但又
# 报错
# 仅能
# 跳过
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何获取PHP WAP自助建站系统源码?
bootstrap日历插件datetimepicker使用方法
详解Android图表 MPAndroidChart折线图
Python图片处理进阶教程_Pillow滤镜与图像增强
Laravel怎么实现支付功能_Laravel集成支付宝微信支付
Firefox Developer Edition开发者版本入口
Java解压缩zip - 解压缩多个文件或文件夹实例
如何快速搭建虚拟主机网站?新手必看指南
原生JS获取元素集合的子元素宽度实例
如何快速搭建高效简练网站?
Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程
JavaScript常见的五种数组去重的方式
绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信
如何在IIS7上新建站点并设置安全权限?
什么是JavaScript解构赋值_解构赋值有哪些实用技巧
如何快速搭建支持数据库操作的智能建站平台?
Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID
怎么用AI帮你为初创公司进行市场定位分析?
Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】
弹幕视频网站制作教程下载,弹幕视频网站是什么意思?
Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】
如何自定义建站之星模板颜色并下载新样式?
详解阿里云nginx服务器多站点的配置
详解MySQL数据库的安装与密码配置
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
Laravel Seeder填充数据教程_Laravel模型工厂Factory使用
Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试
Laravel如何使用Vite进行前端资源打包?(配置示例)
php json中文编码为null的解决办法
宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法
如何快速重置建站主机并恢复默认配置?
非常酷的网站设计制作软件,酷培ai教育官方网站?
js代码实现下拉菜单【推荐】
香港服务器网站卡顿?如何解决网络延迟与负载问题?
网站制作壁纸教程视频,电脑壁纸网站?
Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用
详解Huffman编码算法之Java实现
Laravel怎么调用外部API_Laravel Http Client客户端使用
Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程
Mybatis 中的insertOrUpdate操作
教学论文网站制作软件有哪些,写论文用什么软件
?
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】
利用 Google AI 进行 YouTube 视频 SEO 描述优化
如何彻底卸载建站之星软件?
如何将凡科建站内容保存为本地文件?
Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】
公司网站制作价格怎么算,公司办个官网需要多少钱?
uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址
Win11怎么开启自动HDR画质_Windows11显示设置HDR选项


// 输出:{"configs":[{"local_address":"eouoeu","local_port":111,"method":"eoeoue","password":"ouoeu","server":"oeuoeu","server_port":"qoeueo","timeout":3333}],"index":1}
}