我正在尝试使用 Gson 和 Retrofit2 获取 POJO 实例。
典型的 JSON 响应如下所示。
我的问题在于该Infobox
领域。在某些情况下,(像这样)该字段将是以下类型的对象,否则为空字符串。
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 来完成它,因为我已经将它用于其他所有内容,并且我不想添加另一个依赖项