我正在使用Gson创建一个Json字符串。到目前为止,我已经使用一些成员序列化了一个相对较小的类,所以我只创建了一个包含所需成员的类,并使用toJson
创建了json。如果它与此问题相关,那么它就在Android应用程序中。
现在我需要创建一个包含许多字段和多个级别的更复杂的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"
}
...
}
在这种情况下,我是否需要为每棵树创建一个不同的类?例如,"程序"的一个类。 part," userInfo"依此类推,然后为" sleep"创建一个类。 root包含每个较小的类作为其成员并在其上使用toJson
?我猜它会起作用,但它是为单个Json创建这么多类的最有效方法吗?
答案 0 :(得分:1)
您可以采取两种方法:
1)为每个"级别"创建Java类,并使用POJO字段。我认为这是正确的方法。 GSON序列化器针对此进行了优化,因此不必担心性能问题。
2)手动创建JSON"#34;。不建议这样做,并且您不会获得任何显着的性能提升。此外,你没有使用“公安条例”的力量。
无论如何,如果可能的话,尝试组织您的数据以减少"级别"尽可能,这肯定有助于提高绩效。
答案 1 :(得分: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.
}
答案 2 :(得分: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));
如果您注意到始终使用相同的代码,则应创建类(以改进映射并消除重复)。如果有几个类几次使用,可以使用这种方法(并避免创建所需的每个类)。