Protobuf中的重复字段如何映射为JSON数组

3
我正在使用Java、Spring-boot、Hibernate技术栈以及Protocol Buffers作为微服务间通信的DTO。在反向代理中,我使用Protocol Buffers的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 中,我有一个键 items,它映射到 JSON 数组。
我想要移除键并仅返回 JSON 数组作为结果。有没有一种简洁的方法来实现这个?
1个回答

1
我认为这是不可能的。
“repeated”必须作为字段修饰符出现,并且字段必须命名。

https://developers.google.com/protocol-buffers/docs/proto3#json

没有明显的理由说明为什么Protobuf不能支持这个1,但是,这将需要扩展其语法以支持在消息级别使用repeated而不是当前在字段级别使用。当然,这也使得proto消息下游的所有内容更加复杂。

当然,JSON允许这样做。

这可能也会使编码和解码变得更加复杂(一个在传输中的消息可以是消息或消息数组)。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接