使用GSON创建POJO时遇到问题

时间:2012-09-24 15:41:50

标签: java android gson

我似乎无法使用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数据对象的方式有问题吗?任何帮助将不胜感激

4 个答案:

答案 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>(); 

}