为protobuf扩展名指定JSON名称

Mff*_*nMn 7 go protocol-buffers

我在消息中添加了一条扩展消息,需要将其作为json封送.但是,扩展消息的字段名称是[message.extension_message_name].

我希望它只是命名extension_message_name,没有大括号和前缀,因为这个扩展消息存在于我们的API的其他地方,并且有这个奇怪的名称会增加混乱.

据我所知,负责的代码位于protobuf/jsonpb中,其中JSONName设置为,fmt.Sprintf("[%s]", desc.Name并且似乎无法覆盖.

任何人有一个解决方法吗?

abc*_*bet 13

根据语言指南

消息字段名称映射为小驼峰命名法并成为 JSON 对象键。如果指定了 json_name 字段选项,则指定的值将用作键。

因此,用标记您的字段json_name应该可以解决问题,例如:

message TestMessage {
    string myField = 1 [json_name="my_special_field_name"];
}
Run Code Online (Sandbox Code Playgroud)

编组为 JSON 时应具有myField名称。my_special_field_name


wgo*_*l01 -1

一种选择是使用 Go 的encoding/json包和标记结构来自己解码/编组 json,如下所示:

type Example struct {
    ExtMessageName string `json:"extension_message_name"`
}

msg := Example{ExtMessageName: "This is a test"}

jsonBytes, err := json.Marshal(msg)

if err != nil {
    fmt.Printf("error: %v", err)
    return
}

fmt.Println(string(jsonBytes))
Run Code Online (Sandbox Code Playgroud)

play.golang.org 上的示例

然后输出:

{"extension_message_name":"This is a test"}
Run Code Online (Sandbox Code Playgroud)