我的应用程序正在与之通信的API发送如下所示的响应:
{
id:12345,
active:1
}
问题是旧版本的API将响应字段作为布尔值而不是像这样的int发送
{
id:12345,
active:false,
}
使用Gson,如何在不知道将返回哪个版本的情况下处理这两个版本?
答案 0 :(得分:3)
为布尔值注册CustomDeserializer,当在任何对象中遇到布尔值时,gson将尝试使用您定义的规则进行反序列化。
@Data
class JsonTestClass {
Boolean active = new Boolean(true);
Integer id;
}
class BooleanJsonDeserializer implements JsonDeserializer<Boolean> {
@Override
public Boolean deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
JsonPrimitive jsonPrimitive = json.getAsJsonPrimitive();
if (jsonPrimitive.isBoolean()) {
return jsonPrimitive.getAsBoolean();
} else {
return jsonPrimitive.getAsInt() == 0 ? false : true;
}
}
}
// TempJson
public static void main(String[] args) throws Exception {
Gson gson = new GsonBuilder()
.registerTypeAdapter(Boolean.class, new BooleanJsonDeserializer()).create();
System.out.println(gson.fromJson("{id:12345,active:1}", JsonTestClass.class).getActive());
System.out.println(gson.fromJson("{id:12345,active:0}", JsonTestClass.class).getActive());
System.out.println(gson.fromJson("{id:12345,active:false}", JsonTestClass.class).getActive());
System.out.println(gson.fromJson("{id:12345,active:true}", JsonTestClass.class).getActive());
}
输出:
true
false
false
true
答案 1 :(得分:0)
PFB处理此问题的方法。
public static void main(String[] args) {
Gson gson = new Gson();
JsonObject obj = gson.fromJson("{ id:12345, active:1}", JsonObject.class);
JsonPrimitive prim = obj.get("active").getAsJsonPrimitive();
if(prim.isBoolean()){
System.out.println("boolean");
}else{
System.out.println("number");
}
}