【问题标题】:Gson deserializing with changing field typesGson 使用不断变化的字段类型反序列化
【发布时间】:2014-12-23 18:55:53
【问题描述】:

我有一个返回的 API 调用:

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

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

所以“额定”字段有时是一个对象或布尔值。 我如何使用 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;
}

【问题讨论】:

  • 您希望得到的rated 字段在任何一种情况下都具有什么值?
  • null 或填充对象
  • 在同一代码中必须使用不同类型的对象有什么意义?我认为你的问题是 false 意味着“null”......所以评级甚至应该消失。

标签: java json gson


【解决方案1】:

为了让它工作,一种方法是实现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 对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-20
    相关资源
    最近更新 更多