GSON:解析JSON键值,有时使用Object&某个时候阵列

时间:2018-05-22 10:16:24

标签: android gson

我正在使用GSON解析JSON String但是有一个键包含Json,它有时是对象,有时是数组。  所以请帮我用gson将它解析为模型类。

  

Resonse with Array

{
   "key" : "test",
   "value" : [
                {
                  "id" : 1,
                  "name": "abc"
                },
                {
                  "id" : 2,
                  "name": "xyz"
                }
             ]
}
  

Resonse with Object

{
   "key" : "test",
   "value" : {
                 "id" : 1,
                 "name": "abc"
             }
}
  

MyModel.java

public class MyModel implements Serializable {
@SerializedName("key")
@Expose
public String key;

@SerializedName("value")
@Expose
public ArrayList<ValueModel> value;

public class ValueModel implements Serializable {
    @SerializedName("id")
    @Expose
    public String id;

    @SerializedName("name")
    @Expose
    public String name;
   }
}

但由于数据类型数组和对象,它始终在exeption中转到 我也试过JsonDeserializer,但我认为我没有很好地实现它 所以请帮我解决它并解析json

4 个答案:

答案 0 :(得分:1)

简单尝试以Object身份访问然后检查instanceof Object并根据该

解析数据
String json="";

JSONObject jsonMain=new JSONObject(json);

Object objectType=jsonMain.get("value");
  if (objectType instanceof JSONObject) {
    JSONObject jsonObjectType=(JSONObject)objectType;
  } else if (json instanceof JSONArray) {
    JSONArray jsonArrayType=(JSONArray)objectType;
  }

如果您使用的是JSONObject

  if (objectType  instanceof JSONObject) {
     UserDetails details = new Gson().fromJson(objectType, UserDetails.class);

 } else if (objectType  instanceof JSONArray) {
     Type listType = new TypeToken<List<UserDetails>>() {
     }.getType();
     List<UserDetails> list = new Gson().fromJson(objectType, listType);
     userDetailsList.addAll(list);
 }

答案 1 :(得分:0)

也为对象添加SerializedName名称并添加自定义getter

public class MyModel implements Serializable {
      @SerializedName("key")
      @Expose
      public String key;

      @SerializedName("value")
      @Expose
      public ArrayList<ValueModel> valueList;

      @SerializedName("value")
      @Expose
      ValueModel modelValue;

      public List<ValueModel> getValueModel() {
          return Collections.singletonList(modelValue);
       }

public class ValueModel implements Serializable {
        @SerializedName("id")
        @Expose
        public String id;

        @SerializedName("name")
        @Expose
        public String name;
       }
     }

答案 2 :(得分:0)

您可以尝试:

gson.fromJson(jsonString, classOfModel)

我认为您可以删除@SerializedName@Expose代码。

答案 3 :(得分:0)

如果您找不到答案。 确认。

public class SomeModel  {

    @SerializedName("my_model")
     private MyModel[] myModel;

    public List<MyModel> getMyModel() {

       return new LinkedList<MyModel>( Arrays.asList(myModel));

    }

     public static class MyModelDeserializer implements JsonDeserializer<MyModel[]> {

    @Override
     public MyModel[] deserialize(JsonElement json, Type typeOfT,
     JsonDeserializationContext context) throws JsonParseException {

      if (json instanceof JsonArray) {

            return new Gson().fromJson(json, MyModel[].class);

      }

      MyModel child = context.deserialize(json, MyModel.class);

         return new MyModel[] { child };
      }
  }
}

参考:https://nayaneshguptetechstuff.wordpress.com/2014/06/21/parsing-json-with-gson-sometimes-object-sometimes-array/