全网整合营销服务商

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

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

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

go 的 `json.marshal` 只能序列化首字母大写的导出字段,小写开头的结构体字段(如 `local_address`)属于未导出成员,会被忽略,导致输出空对象 `{}`。解决方法是将字段名首字母大写并添加 json 标签,或自定义 `marshaljson` 方法。

在 Go 语言中,JSON 序列化依赖于 字段的可见性(exported/unexported),而非字段是否被显式标记。encoding/json 包运行在独立包内,它无法访问非导出(即小写开头)的结构体字段——这是 Go 的基础封装机制决定的。因此,原始代码中所有字段(如 local_address, local_port 等)均为小写开头,json.Marshal 对它们“视而不见”,最终只得到一个空 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}
}

⚠️ 注意事项:

  • 字段名必须以大写字母开头(如 LocalAddress),否则即使加了 json 标签也无效;
  • json 标签中的值(如 "local_address")定义了 JSON 输出的键名,支持别名、忽略("-")和条件省略(",omitempty");
  • 若因设计需要保留字段私有性(不导出),可实现 MarshalJSON() ([]byte, error) 方法来自定义序列化逻辑,但会增加维护成本,一般不推荐;
  • 嵌套结构体同理:所有层级中参与 JSON 序列化的字段都必须是导出字段。

总结:Go 的 JSON 序列化严格遵循“导出即可见”原则。养成首字母大写 + 显式 json 标签的习惯,是编写健壮、可维护序列化代码的关键实践。


# word  # js  # git  # json  # go  # ai  # 解决方法  # igs  # 封装  # Error  # 结构体  # 对象  # 序列化  # 首字母  # 字段名  # 自定义  # 这是  # 键名  # 均为  # 而非  # 视而不见 


相关文章: 香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  深圳企业网站制作设计,在深圳如何网上全流程注册公司?  建站之星后台密码遗忘?如何快速找回?  建站之星如何优化SEO以实现高效排名?  如何通过.red域名打造高辨识度品牌网站?  如何快速搭建高效WAP手机网站?  建站主机功能解析:服务器选择与快速搭建指南  学校建站服务器如何选型才能满足性能需求?  代购小票制作网站有哪些,购物小票的简要说明?  香港服务器建站指南:免备案优势与SEO优化技巧全解析  建站主机如何选?性能与价格怎样平衡?  北京的网站制作公司有哪些,哪个视频网站最好?  建站之星上传入口如何快速找到?  内网网站制作软件,内网的网站如何发布到外网?  如何选择美橙互联多站合一建站方案?  如何选择长沙网站建站模板?H5响应式与品牌定制哪个更优?  Android滚轮选择时间控件使用详解  定制建站流程步骤详解:一站式方案设计与开发指南  公司门户网站制作流程,华为官网怎么做?  如何在阿里云购买域名并搭建网站?  如何在宝塔面板创建新站点?  文字头像制作网站推荐软件,醒图能自动配文字吗?  *服务器网站为何频现安全漏洞?  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法  如何快速搭建高效简练网站?  如何在阿里云ECS服务器部署织梦CMS网站?  北京企业网站设计制作公司,北京铁路集团官方网站?  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  网站制作的方法有哪些,如何将自己制作的网站发布到网上?  如何用已有域名快速搭建网站?  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  ppt在线制作免费网站推荐,有什么下载免费的ppt模板网站?  如何用低价快速搭建高质量网站?  网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?  详解jQuery中基本的动画方法  如何在阿里云服务器自主搭建网站?  如何用花生壳三步快速搭建专属网站?  如何在阿里云通过域名搭建网站?  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  建站之星免费模板:自助建站系统与智能响应式一键生成  合肥做个网站多少钱,合肥本地有没有比较靠谱的交友平台?  建站之星安装需要哪些步骤及注意事项?  制作网页的网站有哪些,电脑上怎么做网页?  Android自定义listview布局实现上拉加载下拉刷新功能  专业商城网站制作公司有哪些,pi商城官网是哪个?  网页设计与网站制作内容,怎样注册网站?  如何通过建站之星自助学习解决操作问题?  建站之星代理如何获取技术支持?  公司网站制作费用多少,为公司建立一个网站需要哪些费用? 

您的项目需求

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