GSON解析中的JSON数组,但对象为空
我正在尝试使用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贬不一,但它会起作用。我之所以这么说是因为您拥有的 不是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获取者/设置者一起访问私有域RealAnswer。对于下一个家伙来说,它看起来似乎更干净,更容易理解。
以上是 GSON解析中的JSON数组,但对象为空 的全部内容, 来源链接: utcz.com/qa/407998.html

