我似乎无法使用GSON从JSON创建POJO(Plan Old Java Object)。我跟着这个tutorial到了T,但我仍然得到一个空对象。这是我的代码:
JSONHandler.java
public class JSONHandler
{
private Gson gson;
private InputStream is;
private Reader reader;
private TripList tripList;
public JSONHandler(InputStream is)
{
this.is = is;
gson = new Gson();
reader = new InputStreamReader(is);
tripList = gson.fromJson(reader, TripList.class);
}
public Gson getGson() {
return gson;
}
public void setGson(Gson gson) {
this.gson = gson;
}
TripList.java
public class TripList
{
@SerializedName("Line")
public String line;
@SerializedName("CurrentTime")
public int currentTime;
public List<Train> Trips;
}
Train.java
public class Train
{
@SerializedName("TripID")
public String tripID;
@SerializedName("Destination")
public String dest;
public List<Prediction> Predictions;
}
Prediciton.java
public class Prediction
{
@SerializedName("StopID")
public int stopID;
@SerializedName("Stop")
public String stop;
@SerializedName("Seconds")
public int seconds;
}
blue.json
{
"TripList":
{
"CurrentTime":1342032950,
"Line":"Red",
"Trips": [
{
"TripID":"R982ECC1E",
"Destination":"Alewife",
"Predictions": [
{"StopID":"70094","Stop":"Ashmont","Seconds":370}
]
},
{
"TripID":"R982ECC78",
"Destination":"Ashmont",
"Note":"Big Red",
"Position":
{"Timestamp":1342032834,"Train":"1809","Lat":42.38725,"Long":-71.11894,"Heading":185},
"Predictions": [
{"StopID":"70067","Stop":"Harvard Square","Seconds":36},
{"StopID":"70069","Stop":"Central Square","Seconds":260}
]
}
]
}
}
JSON格式将遵循this范例。当无法正确解析某些内容时,GSON不会抛出错误,它只返回一个令人恼火的空值。格式或处理java数据对象的方式有问题吗?任何帮助将不胜感激
答案 0 :(得分:0)
我认为JSON不知道如何阅读public List<Train> Trips;
,因为通用性只是编译时。
请参阅https://sites.google.com/site/gson/gson-user-guide#TOC-Collections-Examples了解更多详情,但基本上,我认为您需要为元素指定TypeToken
答案 1 :(得分:0)
当我遇到这个问题时,我们遇到了类型擦除 - 你可能想要研究实现泛型(如果你的代码中会有更多的List元素),或者明确地告诉Gson你要序列化的类型是什么类型< / p>
答案 2 :(得分:0)
有一个小问题:你正在读一个包含TripList的对象:
{
"TripList": ...
}
但你告诉Gson你正在阅读TripList本身:
tripList = gson.fromJson(reader, TripList.class);
由于TripList
不包含名为TripList
的属性,因此它执行的操作:未知属性(即“TripList”)在缺少属性(即“TripList”的所有成员)时被忽略保持默认值。
所以Gson在这里行为正确。我不知道这里是否存在泛型问题。如果是这样,其他答案可能有所帮助。
那里没有其他问题,我已经尝试过了。只需删除封闭的东西。
答案 3 :(得分:0)
尝试初始化每个模型类中的列表。
即
public class TripList
{
@SerializedName("Line")
public String line;
@SerializedName("CurrentTime")
public int currentTime;
public List<Train> Trips = new ArrayList<Train>();
}