从不同包中的结构切片定制JSON Marshal

时间:2017-12-29 09:09:54

标签: json go struct package marshalling

我的目标是从结构创建JSON编组但具有不同的字段。 例如,我的结构有UID, Name, and Type个字段,但我想要仅仅有两个字段。

我有这样的事情:

package entity

type Farm struct {
    UID string
    Name string
    Type string
}

-----------------------

package server

func(f entity.Farm) MarshalJSON() ([]byte, error) {
    return json.Marshal(struct {
        UID  string `json:"uid"`
        Name string `json:"name"`
    }{
        UID:  f.UID,
        Name: f.Name,
    })    
}

func main() {
    farms := []entity.Farm{}
    farms.append(farms, Farm{"123", "MyFarm1", "organic"})
    farms.append(farms, Farm{"456", "MyFarm2", "organic"})

    json, _ = json.Marshal(farms)
}

问题是我无法从MarshalJSON()创建entity.Farm的自定义方法,因为它位于另一个包中。谷歌说我应该做自定义类型并从中制作MarshalJSON()的自定义方法。但我仍然不知道如何在[]entity.Farm

中将[]MyFarm转换为func main()

所以在这里,如果我尝试使用自定义类型:

package server

type MyFarm entity.Farm

func(mf MyFarm) MarshalJSON() ([]byte, error) {
    return json.Marshal(struct {
        UID  string `json:"uid"`
        Name string `json:"name"`
    }{
        UID:  mf.UID,
        Name: mf.Name,
    })    
}

func main() {
    farms := []entity.Farm{}
    farms.append(farms, Farm{"123", "MyFarm1", "organic"})
    farms.append(farms, Farm{"456", "MyFarm2", "organic"})

    // Here I need to convert farms slice to []MyFarm slice 
    // so that I can use my custom MarshalJSON() from MyFarm
}

那么如何将farms切片转换为MyFarm切片,以便我可以使用MyFarm中的自定义MarshalJSON()?

我无法将Farm结构包更改为package server

0 个答案:

没有答案