前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >解决使用Proto生成的类转json时字段缺失的问题

解决使用Proto生成的类转json时字段缺失的问题

原创
作者头像
Porco1Rosso
修改2020-05-29 14:23:29
3.9K0
修改2020-05-29 14:23:29
举报

问题描述

在使用Gin 开发RestFul接口时,需要使用别人已经定义好的结构体作为返回内容(方便管理和修改),在最后返回数据时出现了一些问题:因为json:”code,omitempty”中“omitempty” 关键字的作用,导致当该字段是个空时,不会返回该字段。

这里 我不能去手动修改生成的proto文件

代码语言:txt
复制
type Response struct {
	Code                 common.Code      `protobuf:"varint,1,opt,name=code,proto3,enum=common.Code"json:"code,omitempty"`
	Message              string           `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"`
	TotalCount           int32 			`protobuf:"varint,3,opt,name=total_count,json=totalCount,proto3"json:"total_count,omitempty"`
	Data                 []*csgo.MainTeam `protobuf:"bytes,4,rep,name=data,proto3" json:"data,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

//假设proto 是这样的,这个时候使用普通的返回方法
func main(){
		ret := Response{
			Code:    common.Success,
			Message: "参数错误",
		}
		//此时返回的json 就只包含了 code 和 message 其他字段因为是空,就不会返回
		ctx.JSON(http.StatusOK, &ret)

		//此方法可以返回所有字段
		var buffer bytes.Buffer
		var ma = jsonpb.Marshaler{
			EnumsAsInts:  true,
			OrigName:     true,
			EmitDefaults: true,
		}
		_ = ma.Marshal(&buffer, &ret)
		ctx.Header("Content-Type", "application/json;charset=utf-8")
		ctx.String(http.StatusOK, buffer.String())


		return
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题描述
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档