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を他のすべてに使用しており、別の依存関係を追加したくないので、Gsonを使用してそれを実行できるようにしたいと考えています