为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕森卡 2021-07-29 15:53:56
我正在编写一个包装器来映射我需要的一些附加功能。一些最重要的事情是在保留通用性的同时编组和解组数据的能力。我设法使用 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 接口和反射才能理解为什么......)

如果有人有更好的答案,我仍然不会将此标记为已解决的问题。


查看完整回答
反对 回复 2021-08-02
  • 2 回答
  • 0 关注
  • 186 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号