簡體   English   中英

如何使用 camelCase JSON 標簽在 Go 中的 gRPC 生成文件中編組結構?

[英]How to use camelCase JSON tags for marshaling structs in gRPC generated files in Go?

以下面的結構為例,

type Foo struct {
    state         protoimpl.MessageState
    sizeCache     protoimpl.SizeCache
    unknownFields protoimpl.UnknownFields

    IsBar         bool            `protobuf:"varint,1,opt,name=is_bar,json=isBar,proto3" json:"is_bar,omitempty"`

IsBar有兩個 JSON 標簽。 當我嘗試 json.Marshal 時,使用了第二個標簽,即 snake_case,但我更喜歡使用 camelCase 之一。 這怎么可能?

使用 protojson 包來編組你的 proto.Message

import(
  "google.golang.org/protobuf/encoding/protojson"
  "google.golang.org/protobuf/proto"
)

func Marshal(m proto.Message)([]byte,error){
   return (protojson.MarshalOptions{}).Marshal(m)
}
 

或者試試gofaster 這是一個 protoc 插件替代 protoc-gen-go。 它支持字段擴展gogoproto.jsontag ,讓您可以自定義 json 標簽。

syntax = "proto3";

package helloworld.v1;

import "google/api/annotations.proto";

import "gogo/protobuf/gogoproto/gogo.proto";

option go_package = "github.com/pigfall/kratos-test/api/helloworld/v1;v1";

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {
    option (google.api.http) = {
      get: "/helloworld/{name}"
    };
  }
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
  string pre_name =2 [(gogoproto.jsontag)="perName"];
}

// The response message containing the greetings
message HelloReply {
  string message = 1;
}


暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM