2013-08-30 60 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