【问题标题】:Parsing JSON result with Gson使用 Gson 解析 JSON 结果
【发布时间】:2015-10-24 04:18:49
【问题描述】:

我有一个包含此 JSON 文件的 InputStreamReader reader: http://barcelonaapi.marcpous.com/bus/nearstation/latlon/41.3985182/2.1917991/1.json

另外,我有一个类 Station,其中包含 ID, streetName, city, utmX, utmy, lat, lon 作为成员。

如果我想用 GSon 解析 JSON 文件,我应该怎么做才能返回 List<Station>?

我试过这个:

gson.fromJson(reader, new TypeToken<List<Station>>(){}.getType());

但它引发了IllegalStateException (Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2)。

如何只提取我感兴趣的数据(我的Station 班级的成员)?

GSon可以吗,或者我需要使用Android SDK提供的JSON标准API(JSONObject和JSONArray)?

【问题讨论】:

    标签: java android json gson


    【解决方案1】:

    您已经很接近了,但在这种情况下,您不能直接映射到 List&lt;Station&gt;,因为它包含在还包含其他一些字段的 json 对象(2 层深)中。这基本上也是错误试图告诉您的内容:您正在指示 Gson 映射到项目的数组/列表(在 json 中:[...]),但它遇到了一个对象(在 json 中:{...})。

    最快的解决方案是创建一个反映这个 json 响应的 POJO。例如:

    public class Response {
        @SerializedName("code") public int mCode;
        @SerializedName("data") public ResponseData mData;
    }
    
    public class ResponseData {
        @SerializedName("transport") public String mTransport;
        @SerializedName("nearstations") public List<Station> mStations;
    }
    

    现在您可以将 json 映射到上面的 Response 并从结果中获取 List&lt;Station&gt;:

    Response response = gson.fromJson(reader, Response.class);
    List<Station> stations = response.mData.mStations;
    // do something with stations...
    

    如果你想做一些更高级的事情,你可以看看写一个custom deserialiser or type adapter。

    【讨论】:

    • 谢谢。但仍然无法正常工作(第 1 行第 21 列路径 $.data 的相同异常)在 JSON 文件中,我认为“nearstations”对应于 List,而不是“data”,不是吗?
    • @Jéjé:哎呀,不知道我是怎么错过的……你说得对。这些站被包裹在另一个 json 对象中。我已经更新了答案以反映这一点。您可能想自己添加一些null 检查。
    猜你喜欢
    • 2017-10-10
    • 2011-02-12
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多