问题描述
在使用Gin 开发RestFul接口时,需要使用别人已经定义好的结构体作为返回内容(方便管理和修改),在最后返回数据时出现了一些问题:因为json:”code,omitempty”中“omitempty” 关键字的作用,导致当该字段是个空时,不会返回该字段。
代码语言:txt复制这里 我不能去手动修改生成的proto文件
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
}