【发布时间】:2016-11-16 13:32:32
【问题描述】:
我正在尝试使用 Gson 和 Retrofit2 获取 POJO 实例。
典型的 JSON 响应类似于 this。
我的问题是 Infobox 字段。在某些情况下,(如this)该字段将是以下类型的对象,否则为空字符串。
class Infobox {
public List<Content> content = new ArrayList<>();
public List<Metum> meta;
}
class Content {
public String dataType;
public String value;
public String label;
public Integer wikiOrder;
}
class Metum {
public String dataType;
public String value;
public String label;
}
我尝试如下编写一个 TypeAdapter
class InfoboxAdapter extends TypeAdapter<Infobox> {
final Gson embedded = new Gson();
@Override
public void write(JsonWriter out, Infobox infobox) throws IOException {
if (infobox == null) {
out.nullValue();
return;
}
out.beginObject();
out.name("content");
embedded.toJson(embedded.toJsonTree(infobox.content), out);
out.name("meta");
embedded.toJson(embedded.toJsonTree(infobox.meta), out);
out.endObject();
}
@Override
public Infobox read(JsonReader in) throws IOException {
if ("".equals(in.peek())) {
return null;
}
return embedded.fromJson(in, Infobox.class);
}
但它失败了java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING
更令人困惑的事实是响应中的字段meta(也是一个对象)在某些情况下的值为null(而不是像infobox这样的空字符串)
我希望能够使用 Gson 来完成它,因为我已经将它用于其他所有内容,并且我不想添加另一个依赖项
【问题讨论】:
-
您好,请查看我的回答
标签: json gson retrofit2 duckduckgo-api