全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Go 中嵌套结构体无法序列化为 JSON 的原因及解决方案

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  # 封装  # 结构体  # 接口  # 对象  # 序列化  # 首字母  # 字段名  # 可在  # 自定义  # 不支持  # 但又  # 报错  # 仅能  # 跳过 


相关文章: 广州建站公司哪家好?十大优质服务商推荐  山东云建站价格为何差异显著?  建站之星北京办公室:智能建站系统与小程序生成方案解析  建站之星如何配置系统实现高效建站?  定制建站价位费用解析与套餐推荐全攻略  佛山网站制作系统,佛山企业变更地址网上办理步骤?  常州企业网站制作公司,全国继续教育网怎么登录?  如何快速建站并高效导出源代码?  如何通过NAT技术实现内网高效建站?  c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】  已有域名和空间如何搭建网站?  建站主机数据库如何配置才能提升网站性能?  企业宣传片制作网站有哪些,传媒公司怎么找企业宣传片项目?  C++时间戳转换成日期时间的步骤和示例代码  岳西云建站教程与模板下载_一站式快速建站系统操作指南  如何选择高效响应式自助建站源码系统?  网站设计制作企业有哪些,抖音官网主页怎么设置?  在线制作视频网站免费,都有哪些好的动漫网站?  C++中引用和指针有什么区别?(代码说明)  制作农业网站的软件,比较好的农业网站推荐一下?  深圳 网站制作,深圳招聘网站哪个比较好一点啊?  如何快速打造个性化非模板自助建站?  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  如何用狗爹虚拟主机快速搭建网站?  如何自定义建站之星模板颜色并下载新样式?  Android使用GridView实现日历的简单功能  ,怎么用自己头像做动态表情包?  天津个人网站制作公司,天津网约车驾驶员从业资格证官网?  c# 在高并发场景下,委托和接口调用的性能对比  建站之星多图banner生成与模板自定义指南  网站制作费用多少钱,一个网站的运营,需要哪些费用?  如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法  如何选择美橙互联多站合一建站方案?  建站之星伪静态规则如何设置?  建站之星CMS五站合一模板配置与SEO优化指南  北京的网站制作公司有哪些,哪个视频网站最好?  深圳网站制作培训,深圳哪些招聘网站比较好?  广州商城建站系统开发成本与周期如何控制?  如何用IIS7快速搭建并优化网站站点?  Python如何创建带属性的XML节点  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  如何在Tomcat中配置并部署网站项目?  网站制作和推广的区别,想自己建立一个网站做推广,有什么快捷方法马上做好一个网站?  小型网站建站如何选择虚拟主机?  建站上传速度慢?如何优化加速网站加载效率?  建站之星如何快速生成多端适配网站?  网站制作企业,网站的banner和导航栏是指什么?  大同网页,大同瑞慈医院官网?  电商网站制作公司有哪些,1688网是什么意思?  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。