2014-12-23 39 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