【问题标题】:Protobuf repeated fields to json array mappingProtobuf 重复字段到 json 数组映射
【发布时间】:2021-06-27 10:29:41
【问题描述】:

我使用 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

我想删除键并仅返回 json 数组作为结果。有没有一种干净的方法来实现这一点?

【问题讨论】:

    标签: java json spring-boot protocol-buffers


    【解决方案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) ...
    

    【讨论】:

      猜你喜欢
      • 2020-04-30
      • 2020-04-17
      • 2019-07-18
      • 1970-01-01
      • 2018-10-05
      • 1970-01-01
      • 1970-01-01
      • 2016-06-24
      • 2023-03-10
      相关资源
      最近更新 更多