Gson:处理可以返回不同原始类型的json对象字段?

时间:2017-01-20 04:15:00

标签: java android gson

我的应用程序正在与之通信的API发送如下所示的响应:

{
    id:12345,
    active:1
}

问题是旧版本的API将响应字段作为布尔值而不是像这样的int发送

{
    id:12345,
    active:false,
}

使用Gson,如何在不知道将返回哪个版本的情况下处理这两个版本?

2 个答案:

答案 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");
    }
}