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)
因为您的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.对于下一个人来说,这似乎更清晰,更容易理解.
| 归档时间: |
|
| 查看次数: |
2247 次 |
| 最近记录: |