一般情况下我们Json解析都是预定义类型,在网络请求时通过OkHTTP与Gson等解析库直接解析成对应类型的数据。
public class Data<T> {
public int code;
public String msg;
public T data;
}
但是有些情况下后台可能会给我们制造一些意外的情况,某些数据可能是未知的类型 ,比如同一个Json 的key对应的Value可能是不同的类型。
class T{
public HashMap<String,未知类型> map;
}
存在Hashmap里面的值可能是String,int,List<String>...
这个时候直接定义为List或着String显然是不可以的,一个Map里面的Value集合可能既有String,又有List。
先看下Gson解析的相关对象
class JsonObject extends JsonElement ...
classJsonArray extends JsonElement ...
JsonElement里面也有相关的判断
public abstract class JsonElement {
public boolean isJsonArray() {
return this instanceof JsonArray;
}
public boolean isJsonObject() {
return this instanceof JsonObject;
}
}
那么就可以预定义为JsonElement的类型,然后通过具体是Obj还是Array来获取具体的数据类型 。
public JsonObject getAsJsonObject() {
if (isJsonObject()) {
return (JsonObject) this;
}
throw new IllegalStateException("Not a JSON Object: " + this);
}
public JsonArray getAsJsonArray() {
if (isJsonArray()) {
return (JsonArray) this;
}
}
这样拿到最终想要的结果
JsonObject jsonObject = jsonElement.getAsJsonObject();
JsonElement value = jsonObject.get(key);
if (value != null) {
string = value.getAsString();
}
...