Java 使用GSON创建POJO时遇到问题
我似乎在使用GSON从JSON创建POJO(PlanOldJava对象)时遇到了问题。我沿着这个方向走到了T,但是我仍然得到了一个空对象。这是我的密码: JSONHandler.javaJava 使用GSON创建POJO时遇到问题,java,android,gson,Java,Android,Gson,我似乎在使用GSON从JSON创建POJO(PlanOldJava对象)时遇到了问题。我沿着这个方向走到了T,但是我仍然得到了一个空对象。这是我的密码: JSONHandler.java public class JSONHandler { private Gson gson; private InputStream is; private Reader reader; private TripList tripList; public JSONH
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;
}
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格式将遵循范例。当无法正确解析某些内容时,GSON不会抛出错误,它只是返回一个令人恼火的空值。我处理java数据对象的格式或方式是否有问题?任何帮助都将不胜感激我认为JSON不知道如何阅读
公共列表代码>因为泛型仅在编译时使用
有关更多详细信息,请参见,但基本上,我认为您需要为元素指定一个TypeToken当我遇到这个问题时,我们遇到了类型擦除-您可能希望研究实现泛型(如果代码中有更多的列表元素)或者明确告诉Gson要序列化的类型有一个小问题:您正在读取一个包含三元组的对象:
{
"TripList": ...
}
但你告诉格森你正在读一个三元组本身:
tripList = gson.fromJson(reader, TripList.class);
由于TripList
不包含名为TripList
的属性,因此会忽略未知属性(即“TripList”),而忽略缺少的属性(即“TripList”的所有成员保留其默认值
所以Gson在这里的行为是正确的。我不知道这里的泛型是否有问题。如果有,其他答案可能会有所帮助
更新
这里没有其他问题,我已经尝试过了。只需删除包含的内容。尝试初始化每个模型类中的列表
即
公共类三元组列表
{
@序列化名称(“行”)
公共弦线;
@SerializedName(“当前时间”)
公共时间;
public List Trips=new ArrayList();
}
另外,这似乎与您的错误有关,列表的类型参数在类三元组中被捕获,因此不需要类型标记。我不知道gson如何知道它是一个火车列表,因为在运行时没有保存此信息。但它是,请参见字段。getGenericType()
通过Trips.class.getDeclaredField(“Train”)获取字段。
通常情况下,它会被删除,但在这里它是类定义的一部分(如果它是类的类型参数,那么它会丢失,但不是)。您错了,List
的类型参数在类TripList
中被捕获,而另一个List
的类型参数也被捕获。擦除在这里没有问题,因为不会丢失任何信息(请参见java.lang.reflect.Field.getGenericType()
).你说得对-回顾我的代码后,我发现我需要实现它,因为我有一个列表,其中概要文件包含一个列表,而其他对象的类型被Gson丢失
{
"TripList": ...
}
tripList = gson.fromJson(reader, TripList.class);
public class TripList
{
@SerializedName("Line")
public String line;
@SerializedName("CurrentTime")
public int currentTime;
public List<Train> Trips = new ArrayList<Train>();
}