2017-02-17 4 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

をいるProtobuf変更は、あなたが問題JSONとタイプのユーザーのいるProtobuf定義を追加していただけますか? –

+0

私はそれをしました – idmitriev

答えて

0

あなたの問題はタイプCの宣言と接続され、その中のプロトであなたdefinitonは、 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)); 

あなたは私たちが100$が、エンコードされたバージョンMTAwJA==を持っていない見ることができるように出力が

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

になりますprotobufを使用してこのjsonをオブジェクトに変換しようとすると、エラーは発生しません。私の意見ではそう

- あなたのDマップ内のいずれかでエンコード値JSONに変換中(またはいるProtobufを使用してJSONに変換)、または宣言

+0

ありがとうMichal、私はそれをあなたが持っている、私はこの場合JsonFormatを使用してjsonからprotoに変換することは不可能だと思います。私はjava.lang.Objectをprotoメッセージにマッピングしたいだけです。 Map データを持つデータオブジェクトがあり、protobufを使用してデータを送信する必要があります。 – idmitriev

+0

私の意見では、json(送信側で)の追加処理なしで、またはprotoの定義の変更なしでは可能ではありません。あなたのケースでは、送信側でprotobufを使ってjsonにシリアル化することも可能ですか? –

+0

ええ、私はprotobufを使用しています。私はとにかくそれをすることができますが、私はまだ正しい方法を知らなかった。今、私はそこから答えを得たので、マップとしてマップすることにしました。 - http://stackoverflow.com/questions/41878400/how-to-map-java-lang-object-in-proto-file -protobuf – idmitriev

関連する問題