2016-11-04 6 views
0
message Example { 
    enum State { 
     Deleted = 1; 
     Inactive = 2; 
     Active = 4; 
    } 

    optional uint64 id      = 1  [(gson_name) = "id"]; 
    optional uint64 state     = 2  [(gson_name) = "state"]; 
    optional uint64 userId     = 3  [(gson_name) = "uui"]; 
    optional sint32 marketId     = 4  [(gson_name) = "m"]; 
    optional uint64 productId    = 5  [(gson_name) = "p"]; 
} 

JSON文字列json stringをprotobufメッセージオブジェクトに変換するにはどうすればよいですか?

v: String = {"m": 97, "state": 1, "uui": 1, "id": 1, "p": 1} 

コールは失敗し、JSONを使用して変換します。

gson.fromJson(v, classOf[Example]) 

例外 java.lang.NullPointerExceptionが

これは、生成されたプロトクラスにJSONに変換する正しい方法であれば、私はわかりません。誰かが私に間違っていることを教えてもらえますか、あるいはこれを達成するための他の方法を提案するかもしれません。私はprotobufバージョン2.6で、このプロジェクトのために実際に3つまで移動することはできません。

答えて

0

メッセージオブジェクト用に生成されたJavaクラスがあるとします。 OPのProto Messageに対してJavaクラスが生成されている場合は、以下のコードを使用できます。

以下のコードは、PROTOメッセージをファイルに書き込みます。あなたがそれを必要としないなら、それをコメントすることができます。

コードは、JSONは、メッセージオブジェクトをいるProtobuf、ファイルに書き込むために変換する: -

public static void main(String[] args) throws IOException { 

     String jsonString = "{\"m\": 97, \"state\": 1, \"uui\": 1, \"id\": 1, \"p\": 1}"; 

     Gson gson = new GsonBuilder().create(); 
     JsonObject jsonObject = gson.fromJson(jsonString, JsonObject.class); 

     ExampleProto.Example.Builder example = ExampleProto.Example.newBuilder();  
     example.setId(jsonObject.get("id").getAsLong()); 
     example.setMarketId(jsonObject.get("m").getAsInt()); 
     example.setProductId(jsonObject.get("p").getAsInt()); 
     example.setState(jsonObject.get("state").getAsInt()); 
     example.setUserId(jsonObject.get("uui").getAsInt()); 

     System.out.println(example.build()); 

     FileOutputStream output = new FileOutputStream(new File("proto.txt")); 
     example.build().writeTo(output); 
     output.close(); 

    } 
+0

おかげで私は私のいるProtobufメッセージ用に生成されたJavaクラスのオブジェクトにデシリアライズJSONを取得するために期待していました。とにかく中間表現に変換しなければならない場合は、gsonの代わりにスプレーのjsonライブラリを使用します。 – user2903819

+0

アノテーションを追加するために生成されたproto Javaクラスを変更して、異なる属性名を記述することはお勧めできません。そこで、属性名を使ってjsonを解析し、それをPROTO javaクラスにマップしました。 – notionquest

関連する問題