Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Go中的嵌入式stuct上实现json封送器_Json_Go - Fatal编程技术网

在Go中的嵌入式stuct上实现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

我想对一个结构进行有效的JSON编码:

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]}