繁体   English   中英

mapstructure 如何使用鉴别器来解码具体类型

[英]How can mapstructure use a discriminator to decode concrete type

文档( https://github.com/mitchellh/mapstructure )提到了 mapstructure 解码的好处

{
  "type": "person",
  "name": "Mitchell"
}

我正在寻找一个显示解码过程的示例,例如解组PersonPet

该库仅将映射映射到结构。 它不进行特定于类型的解码。 引用其文档:

也许我们无法在不首先从 JSON 中读取“类型”字段的情况下填充特定结构。 我们总是可以对 JSON 的解码进行两次传递(首先读取“类型”,然后再读取其余部分)。 但是,将其解码为map[string]interface{}结构,读取“type”键,然后使用类似这个库的东西将其解码为正确的结构要简单得多。

它提供的只是您只需将 JSON 源解析一次,转换为映射,然后您可以自己决定需要映射或解组为哪种类型。 然后你就可以使用已经构建好的地图来填充你需要的类型了。

看这个例子:

type Person struct {
    Name string `json:"name"`
}

type Credentials struct {
    User     string `json:"user"`
    Password string `json:"password"`
}

func main() {
    for _, src := range []string{srcPerson, srcCredentials} {
        var m map[string]interface{}
        if err := json.Unmarshal([]byte(src), &m); err != nil {
            panic(err)
        }

        switch m["type"] {
        case "person":
            var p Person
            if err := mapstructure.Decode(m, &p); err != nil {
                panic(err)
            }
            fmt.Printf("%T %+v\n", p, p)
        case "credentials":
            var c Credentials
            if err := mapstructure.Decode(m, &c); err != nil {
                panic(err)
            }
            fmt.Printf("%T %+v\n", c, c)
        }
    }
}

const srcPerson = `{
  "type": "person",
  "name": "Mitchell"
}`

const srcCredentials = `{
  "type": "credentials",
  "user": "bob",
  "password": "secret"
}`

输出:

main.Person {Name:Mitchell}
main.Credentials {User:bob Password:secret}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM