Go开发中JSON无法反序列化为gogo/protobuf的types.Struct问题求助
解决gogo/protobuf types.Struct 反序列化JSON为空的问题
问题根因
标准库encoding/json无法直接正确反序列化github.com/gogo/protobuf/types下的types.Struct类型,原因是该结构体是Protobuf生成的专属类型,内部字段带有Protobuf自定义序列化标签,且JSON序列化规则和标准库规则不兼容,直接用json.Unmarshal会出现无报错但结果为空的问题。
解决方案
方案1:复用已有map反序列化逻辑,调用官方转换方法
你已经实现了将JSON字符串反序列化为map[string]interface{}的逻辑,直接调用types.StructFromMap内置方法转换即可,改动最小:
var dat map[string]interface{} if err := json.Unmarshal([]byte(device.Config), &dat); err != nil { return nil, err } // 直接将map转为目标Struct类型 s, err := types.StructFromMap(dat) if err != nil { return nil, err }
方案2:使用gogo proto专属JSON反序列化工具
使用gogo proto官方提供的jsonpb包直接反序列化,不需要经过map中转:
首先导入依赖包:
import "github.com/gogo/protobuf/jsonpb"
反序列化代码:
s := &types.Struct{} // 用jsonpb反序列化 if err := jsonpb.Unmarshal(strings.NewReader(device.Config), s); err != nil { return nil, err }
选型建议
如果你的数据库存储的JSON是普通业务JSON(不是types.Struct序列化生成的带fields、Kind层级的特殊格式),优先选方案1,兼容性更强。如果存储的内容本身就是types.Struct序列化输出的JSON,两种方案都可以直接使用。
内容的提问来源于stack exchange,提问作者Javier Manzano
相关产品推荐
相关产品推荐

