使用Gson创建大型Json字符串的正确方法

时间:2017-10-17 08:30:10

标签: java json gson android

我正在使用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创建这么多类的最有效方法吗?

3 个答案:

答案 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));

如果您注意到始终使用相同的代码,则应创建类(以改进映射并消除重复)。如果有几个类几次使用,可以使用这种方法(并避免创建所需的每个类)。