在Go中的嵌入式stuct上实现json封送器
我想对一个结构进行有效的JSON编码:在Go中的嵌入式stuct上实现json封送器,json,go,Json,Go,我想对一个结构进行有效的JSON编码: type MyStruct struct { *Meta Contents []interface{} } type Meta struct { Id int } 结构包含已知表单的元数据和未知表单的内容,内容列表在运行时填充,因此我无法真正控制它们。为了提高Go的封送速度,我想在元结构上实现封送器接口。Marshaller接口如下所示: type Marshaler interface { MarshalJSO
type MyStruct struct {
*Meta
Contents []interface{}
}
type Meta struct {
Id int
}
结构包含已知表单的元数据和未知表单的内容,内容列表在运行时填充,因此我无法真正控制它们。为了提高Go的封送速度,我想在元结构上实现封送器接口。Marshaller接口如下所示:
type Marshaler interface {
MarshalJSON() ([]byte, error)
}
package main
import (
"fmt"
"encoding/json"
"strconv"
)
type MyStruct struct {
*Meta
Contents []interface{}
}
type Meta struct {
Id int
}
func (m *MyStruct) MarshalJSON() ([]byte, error) {
// Here you do the marshalling of Meta
meta := `"Id":` + strconv.Itoa(m.Meta.Id)
// Manually calling Marshal for Contents
cont, err := json.Marshal(m.Contents)
if err != nil {
return nil, err
}
// Stitching it all together
return []byte(`{` + meta + `,"Contents":` + string(cont) + `}`), nil
}
func main() {
str := &MyStruct{&Meta{Id:42}, []interface{}{"MyForm", 12}}
o, err := json.Marshal(str)
if err != nil {
panic(err)
}
fmt.Println(string(o))
}
请记住,元结构并不像这里显示的那么简单。我曾尝试在元结构上实现封送处理程序接口,但似乎当我对MyStruct进行JSON封送处理时,结果只是元封送处理接口返回的结果
所以我的问题是:我如何用JSON封送一个结构,它包含一个带有JSON封送器的嵌入式结构和另一个没有JSON封送器的结构?,因为匿名字段
*Meta
的封送JSON
方法将升级为MyStruct
,当MyStruct被封送时,encoding/json
包将使用该方法
您可以做的是,不让Meta
实现Marshaller
接口,您可以在MyStruct上实现如下接口:
type Marshaler interface {
MarshalJSON() ([]byte, error)
}
package main
import (
"fmt"
"encoding/json"
"strconv"
)
type MyStruct struct {
*Meta
Contents []interface{}
}
type Meta struct {
Id int
}
func (m *MyStruct) MarshalJSON() ([]byte, error) {
// Here you do the marshalling of Meta
meta := `"Id":` + strconv.Itoa(m.Meta.Id)
// Manually calling Marshal for Contents
cont, err := json.Marshal(m.Contents)
if err != nil {
return nil, err
}
// Stitching it all together
return []byte(`{` + meta + `,"Contents":` + string(cont) + `}`), nil
}
func main() {
str := &MyStruct{&Meta{Id:42}, []interface{}{"MyForm", 12}}
o, err := json.Marshal(str)
if err != nil {
panic(err)
}
fmt.Println(string(o))
}
{“Id”:42,“内容”:[“MyForm”,12]}