2017-02-17 71 views
0

我想將json轉換爲proto消息對象,但是如果在json中有一些 字符,如$或。或_我得到一個InvalidProtocolBufferException。 我原:protobuf3 JsonFormat InvalidProtocolBufferException無法識別的字符

syntax = "proto3"; 

package messages; 
option java_multiple_files = true; 

message Main { 
    A a = 1; 
} 

message A { 
    repeated B b = 1; 
} 

message B { 
    repeated C c = 1; 
} 

message C { 
    map<string, bytes> d = 1; 
} 

Java代碼:

String json = "{\n" + 
     " \"a\" : {\n" + 
     " \"b\" : [ {\n" + 
     "  \"c\" : [ {\n" + 
     "  \"d\" : {\n" + 
     "   \"money\" : [ \"100$\" ]\n" + 
     "  }\n" + 
     "  } ]\n" + 
     " } ]\n" + 
     " }\n" + 
     "}"; 
    Main.Builder builder = Main.newBuilder(); 
    JsonFormat.parser().merge(json, builder); 
    System.out.println(builder.build()); 

輸出:

com.google.protobuf.InvalidProtocolBufferException: com.google.common.io.BaseEncoding$DecodingException: Unrecognized character: $ 

     at com.google.protobuf.util.JsonFormat$ParserImpl.merge(JsonFormat.java:1065) 
     at com.google.protobuf.util.JsonFormat$Parser.merge(JsonFormat.java:273) 
+0

能否請您補充問題JSON和protobuf的定義類型用戶的? –

+0

我已經完成了,請檢查 – idmitriev

回答

0

在我看來你的問題是在原definiton C型的聲明連接,它裏面你有map<string,bytes> d = 1;在Java端將是:Map<String, ByteString>而在你的Json中,你有一些「看起來像」字符串字符串映射。

讓我們做快速的實驗,並嘗試在你的主要類型轉換成JSON:

Main main = Main.newBuilder().setA(
     A.newBuilder().addB(
       B.newBuilder().addC(
         C.newBuilder().putD("money", 
           ByteString.copyFrom("100$".getBytes())) 
       ) 
     ) 
).build(); 

System.out.println(JsonFormat.printer().print(main)); 

輸出將是

{ 
    "a": { 
    "b": [{ 
     "c": [{ 
     "d": { 
      "money": "MTAwJA==" 
     } 
     }] 
    }] 
    } 
} 

正如你可以看到,我們沒有100$但編碼版本MTAwJA==如果你嘗試使用protobuf將這個json轉換爲對象,你將不會有錯誤。

在我看來

所以 - 轉換爲JSON過程中你d地圖或者編碼值(或使用的protobuf轉換成JSON),或更改protobuf的聲明

+0

謝謝Michal,我認爲你是這樣的,我認爲在這種情況下使用JsonFormat從json轉換爲proto是不可能的。我只是想將java.lang.Object映射到proto消息。我有一個Map 數據的數據對象,我需要使用protobuf發送它。 – idmitriev

+0

在我看來,如果沒有額外的json處理(在發送方),或者沒有改變原始定義,它將不可能實現。有可能在你的情況下,在發件人端,你也可以使用protobuf來序列化爲json? –

+0

是的,在兩邊我使用protobuf。無論如何,我可以做到,但我還沒有正確的方式。現在我決定把它映射爲map ,因爲我從那裏得到了答案 - http://stackoverflow.com/questions/41878400/how-to-map-java-lang-object-in-proto-file -protobuf – idmitriev