我正在使用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
答案 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 };
}
}
}