为了账号安全,请及时绑定邮箱和手机立即绑定

如何在json的接口中存储不同的结构

如何在json的接口中存储不同的结构

Go
温温酱 2021-12-07 10:53:23
http://play.golang.org/p/JJnU5ag234我只能让 vA 直接工作,如果我想根据我期望的 json 使用我的 vI 在其中存储 A 或 B,我得到json:无法将对象解组为 main.TA 类型的 Go 值package mainimport (    "encoding/json"    "fmt"    "strings")type T interface {    Printer()}type A struct{ JA string }func (t A) Printer() { fmt.Print("A") }type B struct{ JB string }func (t B) Printer() { fmt.Print("B") }var vA []Avar vB []Bvar vI []Tfunc main() {    // vA = []A{A{}}    // vI = []T{B{}}    vI = []T{A{}}    get()}func get() {    dec := json.NewDecoder(strings.NewReader("[{\"JA\":\"OK\"}]"))    if err := dec.Decode(&vI); err != nil {        fmt.Print(err)    }    for _, v := range vI {        v.Printer()    }}
查看完整描述

1 回答

?
波斯汪

TA贡献1811条经验 获得超4个赞

由于您希望解码器填充结构的字段,因此您必须使用指针。像这样在类型的指针上定义接口的方法:http : //play.golang.org/p/WUMt9Ok9Xp


package main


import (

    "encoding/json"

    "fmt"

    "strings"

)


type T interface {

    Printer()

}


type A struct {

    JA string

}


func (a *A) Printer() {

    fmt.Printf("A: %v\n", a.JA)

}


type B struct {

    JB string

}


func (b *B) Printer() {

    fmt.Printf("B: %v\n", b.JB)

}


func main() {

    vI := []T{&A{}, &B{}}

    dec := json.NewDecoder(strings.NewReader("[{\"JA\":\"OKA\"}, {\"JB\":\"OKB\"}]"))

    if err := dec.Decode(&vI); err != nil {

        fmt.Print(err)

    }

    for _, v := range vI {

        v.Printer()

    }

}


查看完整回答
反对 回复 2021-12-07
  • 1 回答
  • 0 关注
  • 148 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信