Как сгенерировать тег struct lowerCamelCase json

#go #protocol-buffers

#Вперед #протокол-буферы

Вопрос:

Согласно Google protoBuf поле должно быть названо с подчеркиванием ie. first_name

примером сообщения будет

 message Name {
  first_name = 1;
}
  

Однако при генерации кода pb name тег поля struct first name совпадает с тем, как он определен в файле proto, а не в нижнем регистре.

 
type Name struct {
  FirstName string   `protobuf:"bytes,3,opt,name=first_name,json=firstName,proto3" json:"first_name,omitempty"`
}
  

Как вы можете заметить, тег JSON подчеркнут json:"first_name,omitempty" , это приводит к сбою, когда я разархивирую json paylod для struct Name .

 "name": {
  "firstName": "foo"
}
  

Единственный способ заставить его работать — это переименовать поле в файле proto в соответствии с полезной нагрузкой JSON следующим образом:

 message Name {
  firstName = 1;
}
  

Есть идеи, как заставить это работать, продолжая при этом использовать рекомендуемый синтаксис protobuf для именования полей?

Комментарии:

1. Вы можете попробовать использовать полезную нагрузку JSON : {"name": {"first_name": "foo"}} .

2. Используйте пакет protojson: «Этот пакет выдает выходные данные, отличные от стандартного пакета ‘encoding / json’, который некорректно работает с сообщениями буфера протокола».

Ответ №1:

IMO. вы можете custom serializer

https://grpc-ecosystem.github.io/grpc-gateway/docs/customizingyourgateway.html

Используя camelCase для JSON, компилятор буфера протокола генерирует теги camelCase JSON, которые можно использовать с пакетом jsonpb. По умолчанию маршаллер jsonpb использует OrigName: true, который использует точный регистр, используемый в файлах proto. Использовать camelCase для представления JSON,

mux := время выполнения.NewServeMux(время выполнения.С помощью опции marshaleroption(время выполнения.MIMEWildcard и среда выполнения.JSONPb{OrigName:false}))

Комментарии:

1. Последняя версия runtime.JSONPb (github.com/grpc-ecosystem/grpc-gateway/v2 v2.5.0) не имеет OrigName . Однако вы можете использовать UseProtoNames: true .