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

Java 使用Gson创建大型Json字符串的正确方法,java,json,gson,android,Java,Json,Gson,Android,我正在使用Gson创建一个Json字符串。到目前为止,我一直在用几个成员序列化一个相对较小的类,所以我只是用所需的成员创建了一个类,并使用toJson来创建json。如果它与这个问题相关,那么它就在Android应用程序中 现在我需要创建一个更复杂的json,它包含多个字段和多个级别。json的一个示例(至少是其中的一部分,只是为了展示它的“精神”): 在这种情况下,是否需要为每棵树创建不同的类?例如,一个用于“程序”部分的类,一个用于“用户信息”的类等等,然后为“睡眠”根创建一个类,其中包含每

我正在使用Gson创建一个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));