JSON がクラスと一致しないためです。
現在の JSON はオブジェクトの配列であり、それぞれがanswer
フィールドとしてオブジェクトを含んでいます。
JSON は、次のようにする必要があります。
String jsonOutput = "[{\"text\":\"text1\"},{\"text\":\"text2\"}]";
コメントから追加する編集:
出力を変更できない場合は、「ラッパー」が必要です。何かのようなもの:
public class AnswerWrapper {
public Answer answer;
// etc
}
そして、それらの配列を使用します。これが、JSON がマップされるものです。Answer
それらをオブジェクトとして見ることはできません。なぜなら、そうではないからです。
追加するもう 1 つの編集:その他のオプションは、クラスのカスタム デシリアライザーを作成することです。これを行うべきかどうかについては少し混乱していますが、うまくいきます。私がそう言う理由は、オブジェクトの配列ではないAnswer
JSON を持っているが、それを望んでいるからです。何が起こっているのか理解していないと混乱する可能性があるため、本番コードでこれに出くわしたらイライラすると思います。
その警告が言われているので、カスタムJsonDeserializer
を作成して使用できますGsonBuilder
:
class AnswerDeserializer implements JsonDeserializer<Answer> {
public Answer deserialize(JsonElement je, Type type,
JsonDeserializationContext jdc)
throws JsonParseException {
return new Answer(je.getAsJsonObject().get("answer")
.getAsJsonObject().get("text").getAsString());
}
}
次に、コードは次のようになります。
public static void main(String[] args) throws Exception{
String jsonOutput = "[{\"answer\":{\"text\":\"text1\"}},{\"answer\":{\"text\":\"text2\"}} ]";
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(Answer.class, new AnswerDeserializer());
Gson gson = gsonBuilder.create();
Answer[] a = gson.fromJson(jsonOutput, Answer[].class);
for(Answer i:a) {
System.out.println(i.text);
}
}
それが私で、JSONが必要なものではなく、GSONを使用して直接シリアライズ/デシリアライズしたい場合Answer
、詳細を隠すラッパーとしてクラスを作成します。
/**
* Due to how our JSON is being provided we created an inner
* class.
**/
public class Answer {
private RealAnswer answer;
private class RealAnswer {
public String text;
}
...
}
Answer
private にアクセスするための public getter/setter を使用しRealAnswer
ます。次の人にとっては、よりクリーンで理解しやすいように思えます。