2016-11-04 44 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字符串轉換爲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

我認爲你已經爲Message對象生成了Java類。如果您爲OP中的Proto消息生成了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

謝謝,但我希望能得到JSON序列化爲我的protobuf消息生成的Java類的對象。如果我不得不轉換爲中間表示,我可能會使用噴射的json庫而不是gson。 – user2903819

+0

建議不要更改生成的原始Java類以添加註釋以提及不同的屬性名稱。因此,使用屬性名稱解析了json並將其映射到PROTO java類。 – notionquest

相關問題