GSON中的JSON数组解析,但对象为空

min*_*eow 2 java android json gson

我试图用json将json字符串转换为对象.

我在下面有一个非常简单的例子,它运行,但结果答案是空的,即:我的答案对象的文本字段为空.

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;
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

Bri*_*ach 5

因为您的JSON与您的班级不符.

您的JSON现在是一个对象数组,每个对象都包含一个answer对象作为字段.

你的JSON就像你需要的东西一样:

String jsonOutput = "[{\"text\":\"text1\"},{\"text\":\"text2\"}]";
Run Code Online (Sandbox Code Playgroud)

编辑以添加评论:

如果无法更改输出,则需要"包装器".就像是:

public class AnswerWrapper {
    public Answer answer;

    // etc
}
Run Code Online (Sandbox Code Playgroud)

并使用这些数组.这就是JSON将映射到的内容.它不能将它们视为Answer对象,因为......它们不是.

再添加一个编辑:您的另一个选择是为您的类编写自定义反序列化器.关于你是否应该这样做,我有点混乱,但它会起作用.我说的原因是你有一个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());
    }

}
Run Code Online (Sandbox Code Playgroud)

然后你的代码看起来像:

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);
    }       
}
Run Code Online (Sandbox Code Playgroud)

如果它是我,并且我有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;
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)

使用公共getter/setter Answer访问私有RealAnswer.对于下一个人来说,这似乎更清晰,更容易理解.