【问题标题】:Correct way of creating a large Json string using Gson使用 Gson 创建大型 Json 字符串的正确方法
【发布时间】:2017-10-17 08:30:10
【问题描述】:

我正在使用 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"
 }
 ...
}

在这种情况下,我需要为每棵树创建不同的类吗?例如,“程序”部分的类,“userInfo”的类等等,然后为“睡眠”根创建一个类,其中包含每个较小的类作为其成员并在其上使用toJson?我猜它会起作用,但它是为单个 Json 创建这么多类的最有效方法吗?

【问题讨论】:

  • 如果你想要你的 json 的 pojo 表示,那么你将需要不同的类来处理各种树级别,就像你建议的那样。如果您不需要,您可能(我不知道 Gson,但我认为它与 Jackson 非常相似)也只需使用 maps/JSONObject 实例和 lists/JSONArray 实例的组合。
  • 有什么问题,gson 会帮你做的吗?
  • 您可以编写类并相互实现它,然后 gson 将完成这项工作

标签: java json gson android


【解决方案1】:

您可以采取两种方法:

1) 为每个“级别”创建 Java 类,并使用 POJO 字段。我认为这是正确的做法。 GSON 序列化程序为此进行了优化,所以不用担心性能。

2) “手动”创建 JSON。不建议这样做,您不会获得任何显着的性能改进。另外,你没有使用 POO 的力量。

无论如何,如果可能的话,尽量组织你的数据以使用尽可能少的“级别”,这肯定会对性能有所帮助。

【讨论】:

    【解决方案2】:

    您可以使用地图来实现目标。在极端情况下(我的意思是,在你不想创建任何类的情况下),如果你想创建这个 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 表示并需要反序列化它的情况下?
    【解决方案3】:

    您可以通过创建模型类和父类来实现这一点。

    例如

    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.
    }
    

    【讨论】:

      猜你喜欢
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 2015-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多