Golang中嵌套类型的序列化实现
Golang中嵌套类型的序列化实现 以下是我的代码
package main
import (
"encoding/json"
"fmt"
)
type Details struct {
ID string `json:"id"`
}
type extended struct {
Details
tn map[string]string
}
func main() {
b, _ := json.Marshal(extended{
Details: Details{
ID: "foo",
},
tn: map[string]string{
"test": "bar",
},
})
fmt.Println(string(b))
}
这是我得到的结果
{"id":"foo"}
而我想要得到的是这个
{"id":"foo", "test":"bar"}
感谢您的帮助。
更多关于Golang中嵌套类型的序列化实现的实战教程也可以访问 https://www.itying.com/category-94-b0.html
6 回复
json.Marshal 仅序列化公开的结构体成员:Go Playground - The Go Programming Language
更多关于Golang中嵌套类型的序列化实现的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
需要将 tn 改为 Tn 以便导出。
私有字段无法进行序列化。
我不希望在原始消息中打印 TN。你的代码打印的是 {"id":"foo","TN":{"test":"bar"}},而我想要的是 {"id":"foo","test":"bar"}。
你需要自定义的 JSON 序列化。为你的 Extended 类型编写一个 MarshalJSON() ([]byte, error) 方法。 json package - encoding/json - Go Packages
要实现嵌套类型的序列化,需要将内部字段导出(首字母大写)并添加JSON标签。以下是修改后的代码:
package main
import (
"encoding/json"
"fmt"
)
type Details struct {
ID string `json:"id"`
}
type Extended struct {
Details
Tn map[string]string `json:"tn"`
}
func main() {
b, _ := json.Marshal(Extended{
Details: Details{
ID: "foo",
},
Tn: map[string]string{
"test": "bar",
},
})
fmt.Println(string(b))
}
输出结果:
{"id":"foo","tn":{"test":"bar"}}
如果希望将tn字段的内容平铺到顶层,可以使用结构体标签inline:
package main
import (
"encoding/json"
"fmt"
)
type Details struct {
ID string `json:"id"`
}
type Extended struct {
Details
Tn map[string]string `json:",inline"`
}
func main() {
b, _ := json.Marshal(Extended{
Details: Details{
ID: "foo",
},
Tn: map[string]string{
"test": "bar",
},
})
fmt.Println(string(b))
}
输出结果:
{"id":"foo","test":"bar"}
注意:inline标签是Go 1.8+版本中引入的特性,需要确保使用的Go版本支持。


