2017-06-01 54 views
1

當定義一個proto文件時,如何指定整個消息是否是map<string, uint64>或者它是否包含map<string, uint64>的元素。因此,例如,你如何寫一個protoProtobuf消息本身是一個映射與消息有一個元素是一個地圖

{ 
    "abc": 1243, 
    "def": 2343 
} 

,其中鍵是任意的,你不知道他們事前,與

{ 
    "foo": { 
     "abc": 1243, 
     "def": 2343 
    } 
} 

我認爲後者將是:

syntax = "proto3"; 

message Result { 
    map<string, uint64> foo = 1; 
} 

但是,您如何定義第一個呢?

回答

0

你說的是二進制格式還是json格式?我問的原因是,就二進制格式而言,後者只是「重複{映射條目}」 - 這是只有事情會出現在電線上(根對象有點不作爲二進制格式的獨立實體存在)。因此......從二進制輸出的角度來看,您最終的原型示例正是您想要的。從json輸出的角度來看,可能根本無法得到你想要的。 Protobuf 不是通用JSON庫;它是一個自發的序列化庫,它恰好將JSON作爲輸出之一 - 但是「自以爲是」是一個關鍵詞:它意味着你可能無法做某些特定的事情。如果你想寫非常特別的 JSON佈局,你應該使用通用的JSON庫,而不是protobuf。

+0

那麼,這關於Go中的模式定義和用法。如果我的結果是'類型響應地圖[string] uint64''proto'文件將如何看起來像?目前,這看起來不起作用,所以我需要一個帶有'map [string] uint64'結構元素的'類型響應結構'。同樣適用於數組BTW。似乎Protobuf消息本身只能是一個結構,對嗎?我不能表示一個平面數組,我只能用一個元素來表示一個數組。 – smares

+0

@smares k ...「struct」,你的意思是'message'?或者你的意思是'google.protobuf.Struct',這是一個非常具體的消息,它包含一個'map '?和*在什麼情況下*是這樣的?這是RPC嗎?序列化?或者是什麼? *通常*,大多數API將期望討論一個'message'(可能通過描述符),這將是您的'Result'類型。請注意,'google.protobuf.Struct'仍然無法表示您的數據,除非API包裝它 - 它確實是'{「abc」:{「number_value」:1243},「def」: {「number_value」:2343}}' - 至少在概念上爲 –

+0

但是*如果*您的特定的庫自動封裝了上述內容,那麼確定:只需使用'google.protobuf.Struct'(根據https://github.com/google /protobuf/blob/master/src/google/protobuf/struct.proto) –

相關問題