使用gson反序列化包含单个列表的对象

时间:2014-10-29 20:04:00

标签: android rest gson deserialization

我有以下json我要反序列化:

{
    "locations": [{
        "id": 17,
        "account_id": 11,
        "name": "The Haunted Lexington",
        "radius": 100
    }]
}

(在这个特殊情况下,只有一个Location,但可能有很多)。

我使用Gson将其反序列化,代码如下:

Gson gson = new GsonBuilder().create();
LocationList ll = gson.fromJson(jsonString, LocationList.class);

我定义了以下类:

public class Location {

    @SerializedName("id")
    private long mId;

    @SerializedName("account_id")
    private long mAccountId;

    @SerializedName("name")
    private String mName;

    @SerializedName("radius")
    private int mRadius;

    public long getId() {
        return mId;
    }

    public String getName() {
        return mName;
    }
}

public class LocationList {
    @SerializedName("locations")
    private List<Location> mLocations;
}

问题是,我有一堆这些&#34;虚拟&#34;包含单个对象的类,这些对象是其他对象的列表(例如UserListMessageList等...)

我想做的是以某种方式解析上面的json所以我可以跳过定义LocationList的中间类定义,如下所示:

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

// Use the same json as above, but skip defining the superfluous "LocationList" class
List<Location> ll = gson.fromJson(jsonString, "locations", ArrayList<Location>.class);

有没有办法可以做到这一点,也许是通过提供自定义反序列化器?

2 个答案:

答案 0 :(得分:0)

我不久前遇到了类似的问题,并且像这样解决了它

// Parse the JSON response.
JSONArray jsonArray = new JSONArray(response);

List<Location> locations = new ArrayList<Location>();

/*
 * Create a Location object for every JSONObject in the response,
 * and add it to the list.
 */
for (int i = 0; i < jsonArray.length(); i++) {
    JSONObject jsonObject = jsonArray.getJSONObject(i);

    Location location = new Gson().fromJson(jsonObject.toString(),
            Location.class);
    locations.add(location);

这里的方法是循环遍历JSON中locations数组中的每个Location,逐个提取它们,然后将它们添加到列表中。

我使用的JSON有一个列表作为根对象,所以你可能无法使用这个JSONArray jsonArray = new JSONArray(response);。这样的事情可能更适合你的情况

JSONObject jsonObject = new JSONObject(jsonString);
JSONArray locationsJsonArray = jsonObject.get("locations");

我没有测试过最后两行,但我认为你明白这一点。

我希望你能用它来解决你的问题。

答案 1 :(得分:0)

我目前正在使用一种简单的方法来实现您的目标:

private static <T> List<T> getList(final String jsonVal, final String listTag, T t) {
    try {
        JsonObject jsonObject = (JsonObject)(new JsonParser()).parse(jsonVal); // root JsonObject. i.e. "locations"
        JsonArray jsonArray = (JsonArray)jsonObject.get(listTag);

        Gson gson = new GsonBuilder().create();
        List<T> list = gson.fromJson(jsonArray, new TypeToken<List<T>>() {}.getType());

        return list;
    } catch (Exception e) {
        throw new IllegalArgumentException("Unexpected json structure!", e);
    }
}

使用示例:

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

String jsonString = "{\"locations\":[{\"id\":17,\"account_id\":11,\"name\":\"The Haunted Lexington\",\"radius\":100}]}";

List<Location> list = getList(jsonString, "locations", new Location());

此方法应该用于其他类,例如:

List<User> userList = getList(jsonString, "users", new User());
List<Message> messageList = getList(jsonString, "messages", new Message());