嵌入结构的多态 JSON 解组

cru*_*nk1 2 polymorphism json nested go unmarshalling

这是一个示例(另请参见https://play.golang.org/p/or7z4Xc8tN):

package main

import (
    "encoding/json"
    "fmt"
)

type A struct {
    X string
    Y int
}

type B struct {
    A
    Y string 
}

func main() {
    data := []byte(`{"X": "me", "Y": "hi"}`)
    b := &B{}
    json.Unmarshal(data, b)
    fmt.Println(b)
    fmt.Println(b.A)

    b = &B{}
    data = []byte(`{"X": "me", "Y": 123}`)
    json.Unmarshal(data, b)
    fmt.Println(b)
    fmt.Println(b.A)
}
Run Code Online (Sandbox Code Playgroud)

哪些输出:

&{{me 0} hi}
{me 0}
&{{me 0} }
{me 0}
Run Code Online (Sandbox Code Playgroud)

有没有办法多态地将字段 Y 解组为 int 或 string?或者甚至因为 BY 被定义而完全解组为 AY ?

我知道有些人可能会建议使用诸如 之类的东西进行解组json.Unmarshall(data, &b.A),但我不知道我是否可以将其融入我当前的设计中。

Adr*_*ian 5

Go 唯一的多态性是接口。嵌入不提供多态性。

如果您尝试解组 JSON,而您无法假设其中一个字段的类型,则可以使用类型字段interface{}以及类型断言fmt.Sprint、 或反射。你应该使用哪个取决于特定的用例——一旦你获得了价值,你打算用它做什么?在某些时候,您必须关心它是 anint还是 a string,这将决定您如何处理该值。