rhi*_*use 7 go protocol-buffers grpc
我是新手grpc并且一直试图json从网络服务器获取响应。然后存根可以json从rpc服务器请求。
在我的.proto文件中,我创建了一个消息类型:
message Post {
int64 number = 1;
string now = 2;
string name = 3;
}
Run Code Online (Sandbox Code Playgroud)
但我无法编组该number字段,因为protoc生成pb.go带有number标记的结构文件:
{
"no": "23",
"now": "12:06:46",
"name": "bob"
}
Run Code Online (Sandbox Code Playgroud)
如何强制Message使用消息字段的小写名称以外的标签“转换”?如使用json标签no,即使在字段名称Message是number。
Zak*_*Zak 12
您可以在 proto 消息定义上设置 proto3 字段选项 json_name
message Post {
int64 number = 1 [json_name="no"];
string now = 2;
string name = 3;
}
Run Code Online (Sandbox Code Playgroud)
小智 7
import "github.com/gogo/protobuf/gogoproto/gogo.proto";
// Result example:
// type Post struct {
// Number int64 `protobuf:"bytes,1,opt,name=number,json=no1,proto3" json:"no2"`
// }
message Post {
int64 number = 1 [json_name="no1", (gogoproto.jsontag) = "no2"];
}
Run Code Online (Sandbox Code Playgroud)
,在哪里:
jsonpb 示例:
import (
"bytes"
"testing"
"encoding/json"
"github.com/golang/protobuf/jsonpb"
"github.com/stretchr/testify/require"
)
func TestJSON(t *testing.T) {
msg := &Post{
Number: 1,
}
buf := bytes.NewBuffer(nil)
require.NoError(t, (&jsonpb.Marshaler{}).Marshal(buf, msg))
require.Equal(t, `{"no1":1}`, buf.String())
buf.Truncate(0)
require.NoError(t, json.NewEncoder(buf).Encode(msg))
require.Equal(t, `{"no2":1}`, buf.String())
}
Run Code Online (Sandbox Code Playgroud)
有关 protobuf扩展的更多信息