Go语言中如何将结构体编组为嵌套JSON对象?
解决Go结构体转嵌套JSON的问题
Go标准库的encoding/json包不支持通过带点的JSON标签直接生成嵌套结构,你之前的写法会把"otherStruct.C"当成普通键名,所以达不到嵌套效果。正确的做法是用嵌套结构体来模拟JSON的层级结构,具体实现如下:
正确的结构体定义
你可以直接在MyStruct中内嵌匿名子结构体:
type MyStruct struct { A string `json:"A"` B int `json:"B"` OtherStruct struct { C string `json:"C"` D int `json:"D"` } `json:"otherStruct"` }
如果需要复用子结构体,也可以单独定义后再嵌入:
type OtherStruct struct { C string `json:"C"` D int `json:"D"` } type MyStruct struct { A string `json:"A"` B int `json:"B"` OtherStruct OtherStruct `json:"otherStruct"` }
序列化示例代码
package main import ( "encoding/json" "fmt" ) type OtherStruct struct { C string `json:"C"` D int `json:"D"` } type MyStruct struct { A string `json:"A"` B int `json:"B"` OtherStruct OtherStruct `json:"otherStruct"` } func main() { data := MyStruct{ A: "Some string", B: 1234, OtherStruct: OtherStruct{ C: "Other string", D: 5678, }, } jsonBytes, err := json.MarshalIndent(data, "", " ") if err != nil { fmt.Println("序列化错误:", err) return } fmt.Println(string(jsonBytes)) }
输出结果
{ "A": "Some string", "B": 1234, "otherStruct": { "C": "Other string", "D": 5678 } }
关键说明
- Go的JSON序列化完全基于结构体的层级关系生成JSON结构,标签仅用于映射键名,无法通过标签创建新的层级。
- 如果原始结构体无法修改(比如来自第三方依赖),可以额外定义一个用于序列化的DTO(数据传输对象)结构体,将原始数据复制到DTO后再执行序列化操作。
内容的提问来源于stack exchange,提问作者Felipe Kelemen Bernardino
相关产品推荐
相关产品推荐

