如何使用GSON解析JSON响应(不同的对象类型)

时间:2014-07-01 16:08:07

标签: android json gson foursquare

问题:从Foursquare Venues API解析以下响应:

{
    meta: {
        code: 200
    }
    notifications: [
    {
        type: "notificationTray"
        item: {
        unreadCount: 0
        }
    }
    ]
    response: {
        venues: [
        {
            id: "5374fa22498e33ddadb073b3"
            name: "venue 1"
        },
        {
            id: "5374fa22498e33ddadb073b4"
            name: "venue 2"
        }
        ],
        neighborhoods: [ ],
        confident: true
    }
}

GSON documentation网站建议使用GSON的解析API将响应解析为JSONArray,然后将每个数组项读入适当的对象或数据类型(示例here)。因此,我最初切换到以下实现:

JsonParser parser = new JsonParser();
                try {
                    JSONObject json = new JSONObject(response);
                    JSONArray venues = json.getJSONObject("response").getJSONArray("venues");

                    int arraylengh = venues.length();
                    for(int i=0; i < arraylengh; i++){
                        Log.d(TAG, "The current element is: " + venues.get(i).toString());
                    }
                }
                catch(JSONException e){

                }

上面的代码给了我一个带有所有“场地”的JSONArray。接下来的问题是我不知道如何将“场地”JSONArray解析/转换为ArrayList(对于我的自定义Venue对象)。

解决方案如JohnUopini所述,通过使用以下实现,我能够成功解析JSON:

GsonBuilder gsonBuilder = new GsonBuilder();
Gson gson = gsonBuilder.create();

JsonParser parser = new JsonParser();
JsonObject data = parser.parse(response).getAsJsonObject();
Meta meta = gson.fromJson(data.get("meta"), Meta.class);
Response myResponse = gson.fromJson(data.get("response"), Response.class);
List<Venue> venues = Arrays.asList(myResponse.getVenues());

使用上面的代码,我能够成功地将“meta”以及“response”JSON属性解析为我的自定义对象。

作为参考,下面是我的Response类(注意:为了测试目的,属性被定义为public。最终实现应该将这些属性声明为private并使用setter / getters进行封装):

public class Response {

    @SerializedName("venues")
    public Venue[] venues;

    @SerializedName("confident")
    public boolean confident;

    Response(){}
}

注意/反馈:在实施接受的答案建议后,我在调试过程中遇到过以下(或类似)异常消息:

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected STRING but was BEGIN_OBJECT

我得到上述异常的原因是因为“场地”JSON中某些孩子的“类型”与我在自定义Venue类中定义此类对象的“类型”不匹配。确保自定义类中的类型与JSON具有一对一的对应关系(即[]是数组属性,{}是Object属性等)。

1 个答案:

答案 0 :(得分:3)

这是正确的,因为您尝试访问的对象不是数组,您应该执行以下操作:

JsonParser parser = new JsonParser();
JsonObject data = parser.parse(response).getAsJsonObject();
Meta meta = gson.fromJson(data.get("meta"), Meta.class);
Response myResponse = gson.fromJson(data.get("response"), Response.class);

或者您可以为3个对象创建一个包含3个类的对象,然后通过GSON解析所有内容。