簡體   English   中英

GSON解析中的JSON數組,但對象為空

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM