我正在编写一个包装器来映射我需要的一些附加功能。一些最重要的事情是在保留通用性的同时编组和解组数据的能力。我设法使用 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 做同样的事情?
2 回答

动漫人物
TA贡献1815条经验 获得超10个赞
“你已经将一个指向抽象接口的指针传递给 json。你应该简单地将一个指针作为抽象接口传递给 Ping ”——这也适用于我的情况。(出于某种原因,指向抽象接口的指针对于 gob 包就足够了。看来我必须多研究 Go 接口和反射才能理解为什么......)
如果有人有更好的答案,我仍然不会将此标记为已解决的问题。
- 2 回答
- 0 关注
- 186 浏览
添加回答
举报
0/150
提交
取消