Java 使用GSON创建POJO时遇到问题

Java 使用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

我似乎在使用GSON从JSON创建POJO(PlanOldJava对象)时遇到了问题。我沿着这个方向走到了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; 

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

}