2017-10-17 97 views
1

我正在使用Gson創建Json字符串。到目前爲止,我已經有幾個成員序列化了一個相對較小的類,所以我剛剛創建了一個需要成員的類,並且使用toJson來創建json。如果它與這個問題有關,那麼它就在Android應用程序中。使用Gson創建大型Json字符串的正確方法

現在我需要創建一個更復雜的json,其中包含許多字段和幾個級別。在JSON的例子(至少它的一部分只是爲了顯示它的「精神」):

"sleep" : { 
    "program" : { 
    "appName" : "name", 
    "appVersion" : "1.7" 
    "serverVersion" : 19 
    }, 
    "userType" : "new", 
    "userInfo" : { 
     "firstName" : "Hans", 
     "lastName" : "Schmidt", 
     "city" : "Berlin", 
     "country" : "Germany", 
    }, 
    "settings" : { 
     "setting1" : "y", 
     "setting2" : "none" 
} 
... 
} 

在這種情況下,我需要建立一個不同的類每棵樹?例如,「程序」部分的一個類,「userInfo」的類等等,然後爲「睡眠」根創建一個類,其中包含每個較小的類作爲其成員並在其上使用toJson?我猜它會起作用,但它是爲單個Json創建這麼多類的最有效方法嗎?

+0

問題是什麼,gson會爲你做這個工作嗎? –

+1

如果你想要一個你的json的pojo表示,那麼你需要像你所建議的那樣爲不同的樹級別設置不同的類。如果你不需要,你可能可能(我不知道Gson,但我認爲它與Jackson非常相似),也可以使用maps/JSONObject實例和列表/ JSONArray實例的組合。 – Thomas

+0

,你可以編寫課程並相互實現,然後gson將完成這項工作 –

回答

0

您可以使用地圖,以實現這一目標。在極端情況下(我的意思是,在情況下,你不希望創建任何類),如果你想創建這個JSON:

{ 
    "sleep":{ 
     "userInfo":{ 
     "firstName":"Hans", 
     "lastName":"Schmidt", 
     "country":"Germany", 
     "city":"Berlin" 
     }, 
     "settings":{ 
     "setting2":"none", 
     "setting1":"y" 
     }, 
     "program":{ 
     "appVersion":"1.7", 
     "serverVersion":19, 
     "appName":"name" 
     }, 
     "userType":"new" 
    } 
} 

你可以這樣做:

Gson gson = new Gson(); 

    Map<String, Object> finalObject= new HashMap<>(); 
    Map<String, Object> sleep= new HashMap<>(); 
    Map<String, Object> program= new HashMap<>(); 
    Map<String, String> userInfo= new HashMap<>(); 
    Map<String, Object> settings= new HashMap<>(); 

    program.put("appName", "name"); 
    program.put("appVersion", "1.7"); 
    program.put("serverVersion", 19); 

    userInfo.put("firstName", "Hans"); 
    userInfo.put("lastName", "Schmidt"); 
    userInfo.put("city", "Berlin"); 
    userInfo.put("country", "Germany"); 


    settings.put("setting1", "y"); 
    settings.put("setting2", "none"); 

    sleep.put("program", program); 
    sleep.put("userType", "new"); 
    sleep.put("userInfo", userInfo); 
    sleep.put("settings", settings); 

    finalObject.put("sleep", sleep); 

    System.out.println(gson.toJson(finalObject)); 

但是,正如在另一個答案中所說,經常建議創建POJO。

編輯

有爲了做到這一點的另一種方式。使用的JSONObject類:

JsonObject finalJsonObject= new JsonObject(); 
    JsonObject jsonSleep= new JsonObject(); 
    JsonObject jsonProgram= new JsonObject(); 
    JsonObject jsonUserInfo= new JsonObject(); 
    JsonObject jsonSettings= new JsonObject(); 

    jsonUserInfo.addProperty("firstName", "Hans"); 
    jsonUserInfo.addProperty("lastName", "Schmidt"); 
    jsonUserInfo.addProperty("country", "Germany"); 
    jsonUserInfo.addProperty("city", "Berlin"); 


    jsonSettings.addProperty("setting2", "none"); 
    jsonSettings.addProperty("setting1", "y"); 

    jsonProgram.addProperty("appVersion", "1.7"); 
    jsonProgram.addProperty("serverVersion", 19); 
    jsonProgram.addProperty("appName", "name"); 


    jsonSleep.add("userInfo", jsonUserInfo); 
    jsonSleep.add("settings", jsonSettings); 
    jsonSleep.add("program", jsonProgram); 
    jsonSleep.addProperty("userType", "new"); 

    finalJsonObject.add("sleep", jsonSleep); 

    System.out.println(String.valueOf(finalJsonObject)); 

如果您發現您總是使用相同的代碼,那麼你應該創建類(以提高測繪和消除重複)。如果有幾個類使用幾次,可以使用這種方法(並避免創建您需要的每個類)。

+0

當它推薦使用POJO?不僅如果我收到一個JSON表示並需要反序列化它? –

+0

@YonatanNir我剛剛編輯了答案。 –

1

您可以採取兩種方法:

1)每一個 「級別」 創建Java類,並與POJO領域發揮。我認爲這是正確的做法。 GSON串行器爲此進行了優化,因此不用擔心性能。

2)手工創建JSON。這是不推薦的,你不會得到任何顯着的性能改進。此外,你沒有使用「公安條例」的權力。

無論如何,如果可能的話,儘量將您的數據組織爲儘可能少的「層次」,這對性能有一定的幫助。

0

您可以通過創建模型類和父類來實現此目的。

例如

Class Sleep{ 


hashmap<String,Object> sleep; 

//getters and setters 



} 



Class program{ 
String appName,appVersion,serverVersion; 

// getters and setters; 


} 

Class userInfo{ 
String firstName,lastName,city,country 

// getters and setters 

} 



Main(){ 

Sleep sleep = new Sleep(); 

Hashmap<String,Object> sl = new HashMap<>(); 
sleep.setSleep() = sl; 

program p = new program(); 
p.setappName("name"); 
p.setappVersion("1.7"); 
p.serverVersion("19"); 

sl.put("program",p); 

// similarly for the userInfo 

new Gson().toJson(sleep); 

// This will give you the nested json as you wanted. 
} 
0

請使用谷歌​​
請使用下面的代碼剪裁它可能會對您有所幫助。

GsonBuilder builder = new GsonBuilder(); 
Gson gson = builder.create(); 
String json = gson.toJson(List<user>);