我试图用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;
}
}
}
答案 0 :(得分:5)
因为您的JSON与您的班级不匹配。
您的JSON现在是一个对象数组,每个对象都包含一个answer
对象作为字段。
你的JSON就像你需要的东西一样:
String jsonOutput = "[{\"text\":\"text1\"},{\"text\":\"text2\"}]";
编辑以添加评论:
如果您无法更改输出,则需要一个"包装器"。类似的东西:
public class AnswerWrapper {
public Answer answer;
// etc
}
并使用其中的数组。这就是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());
}
}
然后你的代码看起来像:
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
的公共getter / setter。对于下一个人来说,这似乎更清晰,更容易理解。