求助 pb 生成结构体, 字段风格问题

2023-03-22 17:53:33 +08:00
 crazystory

pb 定义

message User {
  int64 user_id = 1;
}

go 结构体

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

	UserId int64 `protobuf:"varint,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`
}

如上定义, 生成的结构体在接收 json 参数的时候 传递的参数如下

{"userId":1000}

{"user_id":1000}

如上描述, pb 生成的结构体在接收 json 参数的时候, 对应的参数能接收 user_id 也能接收 userId. 两种风格的参数都能正确传递, 这样虽然可以用, 但是对 api 定义不太严谨. 查阅了一些资料没找到解决方案 希望只能接收一种风格的参数, 要么 user_id 要么 userId

有大佬解答一下吗

1277 次点击
所在节点    Go 编程语言
4 条回复
coderxy
2023-03-22 18:00:13 +08:00
protobuf json tag 搜一下
crazystory
2023-03-22 18:26:16 +08:00
@coderxy 感谢
但是现在遇到了新的问题
```
int64 user_id = 1 [json_name="userId"];
```

如果 json_name 定义为 user_id 的情况下 已经不可以接收 userId 这样的驼峰参数
但是如果 json_name 为上面的 userId 依然同时可以接收两种类型的参数

现在考虑到前端的工作量, 计划仅保留驼峰风格
coderxy
2023-03-22 18:58:01 +08:00
定义两个字段 一个 userId 一个 user_id ,自己在处理时兼容一下
zizon
2023-03-23 13:46:53 +08:00
https://github.com/golang/protobuf/blob/master/protoc-gen-go/generator/generator.go#L2225
看这里主要看下怎么控制 name/field_name/json_name 统一吧.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/926281

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX