[英]JSON array in GSON parses, but objects are empty
我試圖用gson將json字符串轉換為對象。
我在下面有一個非常簡單的示例,它可以運行,但是結果答案為空,即:我的Answer對象的文本字段為空。
import com.google.gson.*;
public class Meow {
public static void main(String[] args) throws Exception{
Gson gson = new Gson();
String jsonOutput = "[{\"answer\":{\"text\":\"text1\"}},{\"answer\":{\"text\":\"text2\"}} ]";
Answer[] a = gson.fromJson(jsonOutput, Answer[].class);
for(Answer i:a) {
System.out.println(i.text);
}
}
public class Answer {
public String text;
public Answer(String text) {
super();
this.text=text;
}
public String toString(){
return text;
}
public void setText(String a){
this.text=a;
}
}
}
因為您的JSON與您的類不匹配。
現在,您的JSON是一個對象數組,每個對象都包含一個answer
對象作為字段。
JSON的處理方式如下所示:
String jsonOutput = "[{\"text\":\"text1\"},{\"text\":\"text2\"}]";
編輯以添加評論:
如果您無法更改輸出,則需要一個“包裝器”。 就像是:
public class AnswerWrapper {
public Answer answer;
// etc
}
並使用這些數組。 這就是JSON將映射到的內容。 它無法將它們視為Answer
對象,因為...不是。
再添加一個編輯:您的另一種選擇是為您的類編寫自定義反序列化器。 對於您是否應該執行此操作,我有點mixed貶不一,但它會起作用。 我說的原因是,你有JSON 不是數組Answer
的對象,但你希望它是。 如果在生產代碼中遇到此問題,我會很生氣,因為如果不了解正在發生的事情,可能會造成混亂。
說了這些警告之后,您可以創建一個自定義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;
}
...
}
隨着公共getter / setter方法Answer
訪問私人RealAnswer
。 對於下一個家伙來說,它看起來似乎更干凈,更容易理解。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.