2013-08-30 34 views
4

实现JSON编组我有,我想一个struct有效JSON编码:在嵌入式stuct围棋

type MyStruct struct { 
    *Meta 
    Contents []interface{} 
} 

type Meta struct { 
    Id int 
} 

该结构包含一个已知的形式和未知形式的内容,内容列表的元数据在运行期间被填充,所以我没有真正控制它们。为了提高Go的编组速度,我想通过Meta结构实现Marshaller接口。 Marshaller界面如下所示:

type Marshaler interface { 
     MarshalJSON() ([]byte, error) 
} 

请记住,Meta结构不像这里显示的那么简单。我试过在Meta结构上实现Marshaler接口,但是当我接着JSON编组MyStruct时,结果似乎只是Meta编组接口返回的结果。

所以我的问题是:我怎样才能JSON编组一个结构,其中包含嵌入式结构与自己的JSON编组和无结构的另一个结构?

回答

4

由于匿名字段*MetaMarshalJSON方法将被提升为MyStruct,所述encoding/json包将使用该方法时MYSTRUCT将被编组。

你可以做的是,而不是让Meta实现Marshaller接口,可以实现这样的MYSTRUCT接口:

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

Playground