2017-10-17 119 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>);