我有一个返回的API调用:
{
"id": 550,
"favorite": false,
"rated": {
"value": 7.5
},
"watchlist": false
}
Run Code Online (Sandbox Code Playgroud)
要么
{
"id": 550,
"favorite": false,
"rated": false,
"watchlist": false
}
Run Code Online (Sandbox Code Playgroud)
所以"rating"字段有时是一个对象或一个布尔值.我如何用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;
}
Run Code Online (Sandbox Code Playgroud)
为了实现这一点,一种方法是实现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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
当你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);
Run Code Online (Sandbox Code Playgroud)
安装此类型适配器后,Gson将尝试将所有命名的属性转换rated为适当的RatedJava对象.
| 归档时间: |
|
| 查看次数: |
1799 次 |
| 最近记录: |