dqwh1202 2018-08-13 18:51
浏览 3381

定义protobuf消息字段的自定义go结构标签

I am new to grpc and have been trying to just fetch a json response from a webserver. The stub can then request the json from the rpc server.

In my .proto file, I created a message type:

message Post {
    int64 number = 1;
    string now = 2;
    string name = 3;
}

But I am not able to marshal the number field, since protoc produces the struct pb.go file with a number tag:

{
        "no": "23",
        "now": "12:06:46",
        "name": "bob"
}

How can I force the Message to be 'converted' with a tag other than the lowercase name of the message field? Such as using the json tag no, even if the field name in the Message is number.

  • 写回答

2条回答 默认 最新

  • drjyvoi734793 2019-03-19 09:35
    关注
    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"];
    }
    

    ,where:

    • no1 - new name for jsonpb marshal/unmarshal
    • no2 - new name for json marshal/unmarshal

    jsonpb example:

    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())
    }
    

    More information about protobuf extensions

    评论

报告相同问题?

悬赏问题

  • ¥15 目前主流的音乐软件,像网易云音乐,QQ音乐他们的前端和后台部分是用的什么技术实现的?求解!
  • ¥60 pb数据库修改与连接
  • ¥15 spss统计中二分类变量和有序变量的相关性分析可以用kendall相关分析吗?
  • ¥15 拟通过pc下指令到安卓系统,如果追求响应速度,尽可能无延迟,是不是用安卓模拟器会优于实体的安卓手机?如果是,可以快多少毫秒?
  • ¥20 神经网络Sequential name=sequential, built=False
  • ¥16 Qphython 用xlrd读取excel报错
  • ¥15 单片机学习顺序问题!!
  • ¥15 ikuai客户端多拨vpn,重启总是有个别重拨不上
  • ¥20 关于#anlogic#sdram#的问题,如何解决?(关键词-performance)
  • ¥15 相敏解调 matlab