#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
.