How parse json array with multiple objects by gson?

后端 未结 3 1251
陌清茗
陌清茗 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<Models.Container> {
    
        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"
        }
      }
    ]
    
    0 讨论(0)
  • 2020-12-10 17:11

    You can set the methods in your model class very easily. Just make a StringRequest. Below is a snippet:

    List<YourModelClass> inpList;
    StringRequest greq = new StringRequest(Request.Method.POST, yourURL, new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    try {
                            Log.d("response array===>  ", response.toString());
    
                            Type type = new TypeToken<List<YourModelClass>>(){}.getType();
                            inpList = new Gson().fromJson(response, type);
    
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    error.printStackTrace();
    
                }
            }){
                @Override
                protected Map<String, String> getParams() throws AuthFailureError {
                    Map<String, String> params = new HashMap<String, String>();
                    //return params back to server, if any
                }
            };
    
            yourVolley.getRequestQueue().add(greq);
    

    I have used this to generate your model class from you json. Your model class will look something like this:

     package com.example;
    
    import javax.annotation.Generated;
    import com.google.gson.annotations.Expose;
    
    @Generated("org.jsonschema2pojo")
    public class YourModelClass {
    
    @Expose
    private Integer type;
    @Expose
    private Object object;
    
    /**
    * 
    * @return
    * The type
    */
    public Integer getType() {
    return type;
    }
    
    /**
    * 
    * @param type
    * The type
    */
    public void setType(Integer type) {
    this.type = type;
    }
    
    /**
    * 
    * @return
    * The object
    */
    public Object getObject() {
    return object;
    }
    
    /**
    * 
    * @param object
    * The object
    */
    public void setObject(Object object) {
    this.object = object;
    }
    
    }
    -----------------------------------com.example.Object.java-----------------------------------
    
    package com.example;
    
    import javax.annotation.Generated;
    import com.google.gson.annotations.Expose;
    
    @Generated("org.jsonschema2pojo")
    public class Object {
    
    @Expose
    private Integer id;
    @Expose
    private Integer type;
    @Expose
    private String city;
    
    /**
    * 
    * @return
    * The id
    */
    public Integer getId() {
    return id;
    }
    
    /**
    * 
    * @param id
    * The id
    */
    public void setId(Integer id) {
    this.id = id;
    }
    
    /**
    * 
    * @return
    * The type
    */
    public Integer getType() {
    return type;
    }
    
    /**
    * 
    * @param type
    * The type
    */
    public void setType(Integer type) {
    this.type = type;
    }
    
    /**
    * 
    * @return
    * The city
    */
    public String getCity() {
    return city;
    }
    
    /**
    * 
    * @param city
    * The city
    */
    public void setCity(String city) {
    this.city = city;
    }
    
    }
    
    0 讨论(0)
  • 2020-12-10 17:20

    This may be a bit late for the original poster, but hopefully it will help someone else.

    I am using Gson in Android. I have seen everyone use custom classes and long way round solutions. Mine is basic.

    I have an ArrayList of many different Object types (Models for my database) - Profile is one of them. I get the item using mContactList.get(i) which returns:

    {"profile": 
        {"name":"Josh",
         "position":"Programmer",
         "profile_id":1,
         "profile_image_id":10,
         "user_id":1472934469
        },
     "user":
        {"email":"example@you.co.za",
         "phone_numbers":[],
         "user_id":1,
         "user_type_id":1
        },
     "follower":
        {"follower_id":3,
         "following_date":1.4729345E9,
         "referred_by_id":2,
         "user_from_id":1,
         "user_to_id":2
        },
     "media":
        {"link":"uploads/profiles/profile-photos/originals/1-G9FSkRCzikP4QFY.png",
         "media_description":"",
         "media_id":10,
         "media_name":"",
         "media_slug":"",
         "medium_link":"uploads/profiles/profile-photos/thumbs-medium/1-G9FSkRCzikP4QFY.png",
         "thumbnail_link":"uploads/profiles/profile-photos/thumbs-small/1-G9FSkRCzikP4QFY.png",
         "uploader_id":1
        }
    }
    

    Now I create the Gson object:

    Gson gson = new Gson();
    // this creates the JSON string you see above with all of the objects
    String str_obj = new Gson().toJson(mContactList.get(i)); 
    

    Now instead of creating a custom class - just pass it through as a JsonObject using the following code:

    JsonObject obj = gson.fromJson(str_obj, JsonObject.class);
    

    And now, you can call the object like so:

    JsonObject profile = obj.getAsJsonObject("profile");
    
    0 讨论(0)
提交回复
热议问题