Protocol buffers Protobuf消息本身是一个映射,而message有一个元素是一个映射

Protocol buffers Protobuf消息本身是一个映射,而message有一个元素是一个映射,protocol-buffers,Protocol Buffers,定义proto文件时,如何指定整个消息是map还是包含map元素。例如,您如何为 { "abc": 1243, "def": 2343 } 其中的关键是任意的,你不知道他们事先,vs { "foo": { "abc": 1243, "def": 2343 } } 我认为后者是: syntax = "proto3"; message Result { map<string, uint64> foo = 1;

定义
proto
文件时,如何指定整个消息是
map
还是包含
map
元素。例如,您如何为

{
    "abc": 1243,
    "def": 2343
}
其中的关键是任意的,你不知道他们事先,vs

{
    "foo": {
        "abc": 1243,
        "def": 2343
    }
}
我认为后者是:

syntax = "proto3";

message Result {
    map<string, uint64> foo = 1;
}
syntax=“proto3”;
消息结果{
map foo=1;
}

但是如何定义第一种格式呢?

您是在谈论二进制格式还是json格式?我问这个问题的原因是,就二进制格式而言,后者只是“重复的{map entry}”-这是唯一会出现在连线上的东西(根对象在二进制格式中并不作为单独的实体存在)。所以从二进制输出的角度来看,您的最后一个原型示例完全符合您的要求。从json输出的角度来看,可能根本不可能得到您想要的东西。Protobuf不是一个通用JSON库;它是一个固执己见的序列化库,碰巧有JSON作为输出之一——但“固执己见”是关键短语:它意味着您可能无法完成某些特定的事情。如果您想编写非常特殊的JSON布局,您应该使用通用JSON库,而不是protobuf。

好的,这是关于Go中的模式定义和用法。如果我的结果是
类型响应映射[string]uint64
那么
proto
文件会是什么样子?目前,这似乎不起作用,所以我需要一个
type-Response-struct
,将
map[string]uint64
作为结构元素。顺便说一句,数组也是如此。Protobuf消息本身似乎只能是一个结构,对吗?我不能表示平面数组,我只能表示一个元素包含数组的结构。@smares k。。。“struct”是指
消息
?或者你是说
google.protobuf.Struct
,这是一条包含
map
的非常具体的消息?这是在什么背景下发生的?这是RPC吗?序列化?还是怎样通常,大多数API都希望讨论
消息
(可能通过描述符),这将是您在此处输入的
结果。请注意,
google.protobuf.Struct
仍然无法完全表示您的数据,除非API包装它-它实际上是
{“abc”:{“number\u value”:1243},“def”:{“number\u value”:2343}
-至少在概念上是这样的,但是如果您的特定库自动封装了上述内容,当然,使用一个<代码>谷歌.OrthBuff.Stult(每)对不起,我指的是Golang struct(像C++结构)。它是REST API,我在谈论它发送的响应。因此,对于调用
GEThttp://api.whatever/friends/
,我要发送的响应是一组朋友。使用Protobuf,响应似乎不是平面的
[{friend},{friend},{friend}]
,而是
{friends:[{friend},{friend},{friend}]}