我有以下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;包含单个对象的类,这些对象是其他对象的列表(例如UserList
,MessageList
等...)
我想做的是以某种方式解析上面的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);
有没有办法可以做到这一点,也许是通过提供自定义反序列化器?
答案 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());