Java 使用Gson创建大型Json字符串的正确方法
我正在使用Gson创建一个Json字符串。到目前为止,我一直在用几个成员序列化一个相对较小的类,所以我只是用所需的成员创建了一个类,并使用Java 使用Gson创建大型Json字符串的正确方法,java,json,gson,android,Java,Json,Gson,Android,我正在使用Gson创建一个Json字符串。到目前为止,我一直在用几个成员序列化一个相对较小的类,所以我只是用所需的成员创建了一个类,并使用toJson来创建json。如果它与这个问题相关,那么它就在Android应用程序中 现在我需要创建一个更复杂的json,它包含多个字段和多个级别。json的一个示例(至少是其中的一部分,只是为了展示它的“精神”): 在这种情况下,是否需要为每棵树创建不同的类?例如,一个用于“程序”部分的类,一个用于“用户信息”的类等等,然后为“睡眠”根创建一个类,其中包含每
toJson
来创建json。如果它与这个问题相关,那么它就在Android应用程序中
现在我需要创建一个更复杂的json,它包含多个字段和多个级别。json的一个示例(至少是其中的一部分,只是为了展示它的“精神”):
在这种情况下,是否需要为每棵树创建不同的类?例如,一个用于“程序”部分的类,一个用于“用户信息”的类等等,然后为“睡眠”根创建一个类,其中包含每个较小的类作为其成员,并在其上使用
toJson
?我猜它会起作用,但这是为一个Json创建这么多类的最有效方法吗?您可以采取两种方法:
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.
}
课堂睡眠{
hashmap睡眠;
//接球手和接球手
}
班级计划{
字符串appName、appVersion、serverVersion;
//接受者和接受者;
}
类用户信息{
字符串firstName、lastName、city、country
//接球手和接球手
}
Main(){
睡眠=新睡眠();
Hashmap sl=新的Hashmap();
sleep.setSleep()=sl;
程序p=新程序();
p、 setappName(“名称”);
p、 setappVersion(“1.7”);
p、 服务器版本(“19”);
sl.put(“程序”,p);
//对于userInfo也是如此
新建Gson().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));
如果您注意到您总是使用相同的代码,那么您应该创建类(以改进映射并消除重复)。如果有些类很少使用,可以使用这种方法(并避免创建所需的每个类)。如果需要json的pojo表示,则需要使用不同的类来表示不同的树级别,如您所建议的。如果你不需要,你也可以(我不知道Gson,但我假设它与Jackson非常相似)使用maps/JSONObject实例和List/JSONArray实例的组合,gson将为您完成这项工作?您只需编写类并彼此实现,然后gson将在建议使用POJO时完成这项工作?不仅当我收到一个json表示并需要反序列化它时?
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));
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));