一個API我的應用程序與通信發送看起來像這樣的迴應:Gson:處理可以返回不同基元類型的json對象字段?
{
id:12345,
active:1
}
的問題是,舊版本的API將響應字段作爲一個布爾值,而不是像這樣
{
id:12345,
active:false,
}
一個int
有了Gson,我怎麼能在不知道哪個版本將被返回的情況下處理這兩個問題?
一個API我的應用程序與通信發送看起來像這樣的迴應:Gson:處理可以返回不同基元類型的json對象字段?
{
id:12345,
active:1
}
的問題是,舊版本的API將響應字段作爲一個布爾值,而不是像這樣
{
id:12345,
active:false,
}
一個int
有了Gson,我怎麼能在不知道哪個版本將被返回的情況下處理這兩個問題?
註冊一個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
我將標誌着這個答案的最好的。只是一點點注意。由於Gson中的TypeAdapter是面向流的,而JsonDeserializer是面向樹的,所以'BooleanJsonDeserializer'的名稱比'BooleanTypeAdapter'更接近該類所做的描述。 –
@LyubomyrShaydariv更改了名稱:)在向GSON註冊TypeAdapter時使用了TypeAdapter –
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");
}
}
把它當作 「對象」 .. – Meenal
可以選中這兩個在if條件一樣,好像(1 ||假){} –