2014-12-23 57 views
2

我有一個API-調用返回:GSON反序列化不斷變化的字段類型

{ 
    "id": 550, 
    "favorite": false, 
    "rated": { 
    "value": 7.5 
    }, 
    "watchlist": false 
} 

{ 
    "id": 550, 
    "favorite": false, 
    "rated": false, 
    "watchlist": false 
} 

所以 「額定」 -field是有時一個對象或一個布爾值。 我如何反序列化與Gson類似的東西?

我的對象,到目前爲止是這樣的:

public class Status{ 
    @Expose public boolean favorite; 
    @Expose public Number id; 
    @Expose public Rated rated; 
    @Expose public boolean watchlist; 
} 
public class Rated{ 
    @Expose public Number value; 
} 
+0

您希望在任何情況下產生的「評級」字段有什麼價值? –

+0

'null'或填充對象 – www40

+0

在同一代碼中必須使用不同類型的對象有什麼意義?我認爲你的問題是,錯誤的意思是「空」......所以評級應該甚至會消失。 –

回答

4

爲了這個工作,一個辦法是實施TypeAdapter<Rated> - 這樣的事情:

public class RatedAdapter extends TypeAdapter<Rated> { 

    public Rated read(JsonReader reader) throws IOException { 
     reader.beginObject(); 
     reader.nextName(); 

     Rated rated; 
     try { 
      rated = new Rated(reader.nextDouble()); 
     } catch (IllegalStateException jse) { 
      // We have to consume JSON document fully. 
      reader.nextBoolean(); 
      rated = null; 
     } 

     reader.endObject(); 

     return rated; 
    } 

    public void write(JsonWriter writer, Rated rated) throws IOException { 
     if (rated == null) { 
      writer.value("false"); 
     } else { 
      writer.value(rated.value); 
     } 
    } 
} 

當你有TypeAdapter到位,你所要做的就是註冊GsonBuilder並創建新的Gson像這樣:

GsonBuilder builder = new GsonBuilder(); 
    builder.registerTypeAdapter(Rated.class, new RatedAdapter()); 
    Gson gson = builder.create(); 

    //Let's try it 
    Status status = gson.fromJson(json, Status.class); 

安裝此類適配器後,Gson將嘗試將名爲rated的所有屬性轉換爲適當的Rated Java對象。

+0

謝謝,幫了我很多 – www40

+1

不客氣。 – PrimosK