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

2020-05-29 14:23:29 浏览数 (1)

问题描述

在使用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
}

0 人点赞