dssqq64884 2016-01-18 02:29
浏览 37
已采纳

如何在json的界面中存储不同的结构

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

I can only make vA work directly, if I want to use my vI to store A or B in it depending on the json I expect, I get

json: cannot unmarshal object into Go value of type main.TA

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条回答 默认 最新

  • drqwbh2150 2016-01-18 04:13
    关注

    Since you expect the decoder to fill the fields of a struct, you have to use pointers. Define methods of the interface on the pointer of the type like this: 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
    ", a.JA)
    }
    
    type B struct {
        JB string
    }
    
    func (b *B) Printer() {
        fmt.Printf("B: %v
    ", 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()
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 R语言Rstudio突然无法启动
  • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像
  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值