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