How parse json array with multiple objects by gson?

后端 未结 3 1279
陌清茗
陌清茗 2020-12-10 16:52

How can I parse json using gson? I have a json array with multiple object types, and I don\'t know, what kind of object I need to create to save this structure. I cannot cha

3条回答
  •  没有蜡笔的小新
    2020-12-10 17:10

    This json structure is inherently gson-unfriendly. i.e You cannot model this cleanly in java because the "object" key refers to a dynamic type. The best you can do with this structure is model it like so:

        public class Models extends ArrayList {
    
        public class Container {
            public int type;
            public Object object;
        }
    
        public class Type1Object {
            public String title1;
            public String title2;
        }
    
        public class Type3Object {
            public String url;
            public String text;
            public int width;
            public int height;
        }
    
        public class Type4Object {
            public int id;
            public int type;
            public int city;
        }
    
    }
    

    Then do some awkward switch on type and the object field:

    String json = "{ ... json string ... }";
    Gson gson = new Gson();
    Models model = gson.fromJson(json, Models.class);
    
    
    for (Models.Container container : model) {
    
        String innerJson = gson.toJson(container.object);
    
        switch(container.type){
            case 1:
                Models.Type1Object type1Object = gson.fromJson(innerJson, Models.Type1Object.class);
                // do something with type 1 object...                                
                break;
            case 2:
                String[] type2Object = gson.fromJson(innerJson, String[].class);
                // do something with type 2 object...
                break;
            case 3:
                Models.Type3Object[] type3Object = gson.fromJson(innerJson, Models.Type3Object[].class);
                // do something with type 3 object...
                break;
            case 4:
                Models.Type4Object type4Object = gson.fromJson(innerJson, Models.Type4Object.class);
                // do something with type 4 object...
                break;
    
        }
    }
    

    Ultimately the best solution is to get the json structure changed to something more compatible with java.

    E.g:

    [
      {
        "type": 1,
        "type1Object": {
          "title1": "title1",
          "title2": "title2"
        }
      },
      {
        "type": 2,
        "type2Object": [
          "string",
          "string",
          "string"
        ]
      },
      {
        "type": 3,
        "type3Object": [
          {
            "url": "url",
            "text": "text",
            "width": 600,
            "height": 600
          },
          {
            "url": "url",
            "text": "text",
            "width": 600,
            "height": 600
          }
        ]
      },
      {
        "type": 4,
        "type4Object": {
          "id": 337203,
          "type": 1,
          "city": "1"
        }
      }
    ]
    

提交回复
热议问题