使用Gson创建大型Json字符串的正确方法
我正在使用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创建这么多类的最有效方法吗?
您可以使用地图,以实现这一目标。在极端情况下(我的意思是,在情况下,你不希望创建任何类),如果你想创建这个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));
如果您发现您总是使用相同的代码,那么你应该创建类(以提高测绘和消除重复)。如果有几个类使用几次,可以使用这种方法(并避免创建您需要的每个类)。
当它推荐使用POJO?不仅如果我收到一个JSON表示并需要反序列化它? –
@YonatanNir我刚刚编辑了答案。 –
您可以采取两种方法:
1)每一个 “级别” 创建Java类,并与POJO领域发挥。我认为这是正确的做法。 GSON串行器为此进行了优化,因此不用担心性能。
2)手工创建JSON。这是不推荐的,你不会得到任何显着的性能改进。此外,你没有使用“*条例”的权力。
无论如何,如果可能的话,尽量将您的数据组织为尽可能少的“层次”,这对性能有一定的帮助。
您可以通过创建模型类和父类来实现此目的。
例如
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.
}
请使用谷歌
请使用下面的代码剪裁它可能会对您有所帮助。
GsonBuilder builder = new GsonBuilder();
Gson gson = builder.create();
String json = gson.toJson(List<user>);
问题是什么,gson会为你做这个工作吗? –
如果你想要一个你的json的pojo表示,那么你需要像你所建议的那样为不同的树级别设置不同的类。如果你不需要,你可能可能(我不知道Gson,但我认为它与Jackson非常相似),也可以使用maps/JSONObject实例和列表/ JSONArray实例的组合。 – Thomas
,你可以编写课程并相互实现,然后gson将完成这项工作 –