You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 16:54:03