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