Go 中嵌套结构体 JSON 序列化失败的解决方案

go 的 `json.marshal` 只能序列化导出(首字母大写)字段;未导出字段(小写开头)会被忽略,导致序列化结果为空对象 `{}`。

在 Go 语言中,JSON 序列化依赖于反射机制,而反射仅能访问导出(exported)字段——即字段名以大写字母开头的成员。你代码中的 Configitem 和 GuiConfig 结构体所有字段均以小写字母开头(如 local_address、configs),因此 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"`
}

修改后,原 main 函数无需改动,即可正确输出:

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

⚠️ 注意事项:

  • 字段名大小写决定是否可被 encoding/json 访问,与 json 标签无关;
  • 若因封装需求必须保留私有字段,可手动实现 json.Marshaler 接口,自定义序列化逻辑(需谨慎维护一致性);
  • 建议统一使用驼峰命名 + json 标签,兼顾 Go 风格与 API 兼容性(如 LocalAddress → "local_address")。

总结:Go 的 JSON 序列化遵循严格的可见性规则——只有导出字段才能被序列化。修正字段首字母大小写是最简单、标准且推荐的解决方式。