java - 使用Gson解析JSON结果

标签 java android json gson

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

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

如果我想用 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(使用 JSONObjectJSONArray )?

最佳答案

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

最快的解决方案是创建一个反射(reflect)此 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<Station>从结果来看:

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

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

关于java - 使用Gson解析JSON结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33309834/

相关文章:

android - 使用 sdk android 从 gmail 发送和接收电子邮件

java - Android:ListView固定 subview 的高度

javascript - Google map 嵌入 Api - 参数 q 无效

java - 解决 JPA 查询查找连接列表中的最后一个条目

java - Maven依赖:tree log: version1 compile (version managed from version2)

安卓/谷歌分析 : How to get string from the EditText and send it to Google Analytics

python - 如何从弹性滚动结果更快地建立 Pandas 数据框?

json - 如何使用 jq 从 json 字符串中提取字段

java - 是否可能与 URLEncoder 发生名称冲突

java - 删除文件夹及其内容 AWS S3 java