json - 嵌入式结构的多态 JSON 解码

标签 json go nested polymorphism 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)
}

哪些输出:

&{{me 0} hi}
{me 0}
&{{me 0} }
{me 0}

有没有办法将字段 Y 多态解码为 int 或字符串?还是因为定义了 B.Y,甚至完全解码为 A.Y?

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

最佳答案

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

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

关于json - 嵌入式结构的多态 JSON 解码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44380095/

相关文章:

javascript - 如何设置智能 Morris.js 折线图 y 边界?

android - 使用 Jackson 将 JSON 对象反序列化为 POJO

Go routine with channel 死锁

go - 有效地列出具有很多条目的目录中的文件

go - 如何将带有 nil 字段的结构插入 mongo?

java - 将 JSON 字符串转换为 Java 对象

python - 使用 Flask 在新页面上将 HTML 表单数据显示为 JSON

angularjs - 如何在 AngularJS 中实现嵌套 View ?

css - 在 short-div 中 Bootstrap 嵌套列

c++ - g++ 不编译某些嵌套模板