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

时间:2016-01-18 02:29:56

标签: go

http://play.golang.org/p/JJnU5ag234

我只能直接让vA工作,如果我想使用我的vI来存储A或B取决于我期望的json,我得到

json:无法将对象解组为main.TA

类型的Go值
package main

import (
    "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 []A
var vB []B
var vI []T

func 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 个答案:

答案 0 :(得分:2)

由于您希望解码器填充结构的字段,因此您必须使用指针。在类型的指针上定义接口的方法,如下所示: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()
    }
}