Protobuf 重复字段到 json 数组映射
Protobuf repeated fields to json array mapping
我正在使用 Java、Spring-boot、Hibernate 堆栈和协议缓冲区作为微服务之间通信的 DTO。在反向代理中,我使用 protobuf 的 java 支持将 protobuf 对象转换为 json。
我有以下结构
message Item {
int64 id = 1;
string name = 2;
int64 price = 3;
}
message MultipleItems {
repeated Item items = 1;
}
将 MultipleItems DTO 转换为 json 得到以下结果:
{
"items": [
{
"id": 1,
"name": "ABC",
"price": 10
},
{
"id": 2,
"name": "XYZ",
"price": 20
}
]
}
在生成的 json 中,我得到了映射到 json 数组的键 items
。
我想删除密钥和 return 只有 json 数组作为结果。有没有一种干净的方法可以实现这一目标?
我认为不可能。
repeated
必须作为修饰符出现在字段上,并且字段必须被命名。
https://developers.google.com/protocol-buffers/docs/proto3#json
没有明显的理由说明 Protobuf 不能支持这个1 但是,它需要扩展其语法以支持使用repeated
在消息级别而不是其当前在字段级别的使用。当然,这也使得 proto 消息下游的一切都变得更加复杂
JSON当然是允许的
它也可能使 en/decoding 复杂化(在线消息可以是消息或消息数组。
1 也许担心的是生成的代码 (!) 也必然更复杂?方法都需要检查消息是数组类型还是结构类型,例如:
func (x *X) SomeMethod(ctx context.Context, []*pb.SomeMethodRequest) ...
而且,在 Golang 前泛型中,不可能以这种方式重载方法,它们需要有不同的名称:
func (x *X) SomeMethodArray(ctx context.Context, []*pb.SomeMethodRequest) ...
func (x *X) SomeMethodMessage(ctx context.Context, *pb.SomeMethodRequest) ...
我正在使用 Java、Spring-boot、Hibernate 堆栈和协议缓冲区作为微服务之间通信的 DTO。在反向代理中,我使用 protobuf 的 java 支持将 protobuf 对象转换为 json。
我有以下结构
message Item {
int64 id = 1;
string name = 2;
int64 price = 3;
}
message MultipleItems {
repeated Item items = 1;
}
将 MultipleItems DTO 转换为 json 得到以下结果:
{
"items": [
{
"id": 1,
"name": "ABC",
"price": 10
},
{
"id": 2,
"name": "XYZ",
"price": 20
}
]
}
在生成的 json 中,我得到了映射到 json 数组的键 items
。
我想删除密钥和 return 只有 json 数组作为结果。有没有一种干净的方法可以实现这一目标?
我认为不可能。
repeated
必须作为修饰符出现在字段上,并且字段必须被命名。
https://developers.google.com/protocol-buffers/docs/proto3#json
没有明显的理由说明 Protobuf 不能支持这个1 但是,它需要扩展其语法以支持使用repeated
在消息级别而不是其当前在字段级别的使用。当然,这也使得 proto 消息下游的一切都变得更加复杂
JSON当然是允许的
它也可能使 en/decoding 复杂化(在线消息可以是消息或消息数组。
1 也许担心的是生成的代码 (!) 也必然更复杂?方法都需要检查消息是数组类型还是结构类型,例如:
func (x *X) SomeMethod(ctx context.Context, []*pb.SomeMethodRequest) ...
而且,在 Golang 前泛型中,不可能以这种方式重载方法,它们需要有不同的名称:
func (x *X) SomeMethodArray(ctx context.Context, []*pb.SomeMethodRequest) ...
func (x *X) SomeMethodMessage(ctx context.Context, *pb.SomeMethodRequest) ...