将 JSON 解组为接口变量,同时匹配 Go 中的基础类型

我正在编写一个包装器来映射我需要的一些附加功能。一些最重要的事情是在保留通用性的同时编组和解组数据的能力。我设法使用 encoding/gob 编码器编写了一个编组器,但由于编组数据是人类可读的会很好,我决定用 JSON 编写另一个实现。


通过使用 Register() 将实现对象实例传递给通用接口变量,我让 gob 从通用接口变量中巧妙地编码和解码为通用接口变量。(此资源帮助我了解详细信息!http://www.funcmain.com/gob_encoding_an_interface)


但是,JSON 没有 Register()。假设我们有一个类型的值


type ConcreteImplementation struct {

    FieldA string

    FieldB string

}


func (c ConcreteImplementation) Key() string {

    return c.FieldA   // ConcreteImplementation implements genericValue

}

在类型变量中


type genericValue interface {

    Key() string

}

当我对其进行编组时,它会像这样输出 JSON:


{"FieldA":"foo","FieldB":"bar"}

当我尝试再次将其解组为 genericValue 类型的变量时,它说:


恐慌:接口转换:地图[字符串]接口{}不是genericValue:缺少方法关键编辑:哎呀,实际上它是这样说的!


Error with decoding! json: cannot unmarshal object into Go value of genericValue

很明显,它试图像这里所说的那样编组数据:http : //blog.golang.org/json-and-go(参见'Generic JSON with interface{}')


我怎样才能让它尝试将数据适合特定的实现,就像 gob 解码器会尝试如果实现是 Register()ed?Register() 是天赐之物,它允许一般地编组和解组,就像什么都没有。我如何让 JSON 做同样的事情?


慕森卡
浏览 187回答 2
2回答

动漫人物

“你已经将一个指向抽象接口的指针传递给 json。你应该简单地将一个指针作为抽象接口传递给 Ping ”——这也适用于我的情况。(出于某种原因,指向抽象接口的指针对于 gob 包就足够了。看来我必须多研究 Go 接口和反射才能理解为什么......)如果有人有更好的答案,我仍然不会将此标记为已解决的问题。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go