2017-01-20 42 views
1

一個API我的應用程序與通信發送看起來像這樣的迴應:Gson:處理可以返回不同基元類型的json對象字段?

{ 
    id:12345, 
    active:1 
} 

的問題是,舊版本的API將響應字段作爲一個布爾值,而不是像這樣

{ 
    id:12345, 
    active:false, 
} 
一個int

有了Gson,我怎麼能在不知道哪個版本將被返回的情況下處理這兩個問題?

+1

把它當作 「對象」 .. – Meenal

+0

可以選中這兩個在if條件一樣,好像(1 ||假){} –

回答

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 
+0

我將標誌着這個答案的最好的。只是一點點注意。由於Gson中的TypeAdapter是面向流的,而JsonDeserializer是面向樹的,所以'BooleanJsonDeserializer'的名稱比'BooleanTypeAdapter'更接近該類所做的描述。 –

+1

@LyubomyrShaydariv更改了名稱:)在向GSON註冊TypeAdapter時使用了TypeAdapter –

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"); 
    } 
} 
相關問題