在Go中将组合对象转换为json

时间:2012-12-29 03:49:05

标签: json types go subclass

我是Go的新手,不确定如何解决这个问题。在OOP术语中,我有一个基类Animal和两个Cat和Dog的子类。我想为Animal指定一个适用于所有动物的ToJson方法。

我的问题是,当我打电话给dog.ToJson()时,我只获得狗的Dog属性而没有动物属性。

如何让ToJson按预期工作(即with recursion)?

编辑:更改了代码以反映lbonn的回答建议,我无法按照自己的意愿去做。 edit2:代码更改后的一致性问题

package main

import (
    "encoding/json"
    "fmt"
)

type Animal struct {
    Name string
}

type Cat struct {
    CatProperty int64
    Animal
}

type Dog struct {
    DogProperty int64
    Animal
}

func ToJson(i interface{}) []byte {
        data,err := json.Marshal(i)
    if err != nil {
        panic("???")
    }
    return data
}

func main() {
    dog := Dog{}
    dog.Name = "rex"
    dog.DogProperty = 2
    fmt.Println(string(ToJson(dog)))
    // Prints {"DogProperty":2}
    // I want it to print {"Name":"rex","DogProperty":2}
}

2 个答案:

答案 0 :(得分:4)

匿名字段的Json编码从第1页开始删除。希望它会回到1.1。有关详细信息,请参阅https://groups.google.com/forum/?fromgroups=#!topic/golang-nuts/jYMHbEv44r4

所以现在使用标准库(使用go 1)可以获得的最佳效果是http://play.golang.org/p/LncNFeN8ys

你总是可以使用skelterjohn的补丁https://github.com/skelterjohn/json/来支持匿名字段,直到1.1发布。

或者使用提示,从修复此问题的来源安装。见https://codereview.appspot.com/6460044

答案 1 :(得分:2)

此处,ToJson方法适用于Animal的匿名字段Dog。来电d.ToJson只是d.Animal.ToJson的可见性快捷方式。 GoLang Tutorials: Anonymous fields in struct

在这里,我会编写一个函数而不是一个方法(一个简单的Marshal包装器):

func ToJson(i interface{}) []byte {
    data,err := json.Marshal(i)
    if err != nil {
        panic("???")
    }
    return data
}

这不是动物或狗特有的,但实际上并不需要。

更一般地说,go中没有真正的继承概念。该语言中使用的对象范例与主流OOP完全不同,如Java或C ++。 Go FAQ提供了一些很好的说明。