当前位置: 首页 > 知识库问答 >
问题:

Protobuf重复字段到json数组的映射

邹海荣
2023-03-14

我使用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数组作为结果。有没有一个干净的方法来实现这一点?

共有1个答案

左丘昕
2023-03-14

我认为这是不可能的。

repeated必须作为修饰符出现在字段上,并且字段必须命名。

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

<罢工> 没有明显的理由说明普罗托布夫不支持这个 但是,它需要扩展其语法以支持在消息级别使用重复的,而不是在字段级别使用它。当然,这也使原始消息下游的所有内容变得更加复杂

当然,JSON确实允许这样做。

这也可能使en/解码复杂化(在线消息可以是一条消息或一组消息)。

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) ...
 类似资料:
  • 我正试图利用谷歌电子表格(谷歌脚本)中的地图功能,使用API从Bittrex获取我的帐户硬币余额。这是我的JSON对象: 理想情况下,我希望根据结果中的键和使用每个对象数据的基础行自动填充标题行。我看到了spme解决方案如何为每种或更复杂的方式使用。但我想这可以通过映射来实现。下面是我如何映射顶行,但不知道如何映射值: 谷歌电子表格中的预期输出为

  • 我在一个名为course的模式中有一个名为students的数我创建了一个路由,允许我使用学生的将学生添加到这个数组中,如下所示: 当我尝试用以下JSON体向我的endpoint发出PUT请求时: 谢谢!

  • 我在python中使用get请求 我得到的结果是 如何访问组织的任何字段?我尝试了x.Organization['id',但没有成功。

  • 问题内容: 我想将一些JSON保留为看起来像这样的elastic(search): 点是具有弹性的geo_point类型的列表。因为它们是geo_point值,所以我需要定义索引映射,但是我能看到的最接近的方法是: 这意味着让每个点都是具有单个位置键和geo_point值的地图。我只想要geo_points,这可能吗? 问题答案: 您可以如下定义映射:

  • 有没有什么方法可以将嵌套的JSON值映射到字段而不需要额外的类?我有一个JSON响应 但是在中,我只需要值。因此,我决定创建Kotlin数据类,并尝试使用注释的选项 下面的代码正在工作 我有几个嵌套值,为它们创建额外的类是相当夸张的。还有比为节点创建嵌套类更好的方法吗?