【发布时间】:2015-08-17 22:13:58
【问题描述】:
我正在尝试从 JSON 响应中反序列化对象列表。 JSON 数组有一个密钥,这会导致使用 GSON 对其进行反序列化时出现问题。
我有大约 20 个类似的对象。
public class Device extends Entity {
String device_id;
String device_type;
String device_push_id;
}
对于大多数情况,有一个返回对象列表的 API 方法。返回的 JSON 如下所示。由于其他客户端,此时更改 JSON 的格式不是一个合理的选择。
{
"devices":[
{
"id":"Y3mK5Kvy",
"device_id":"did_e3be5",
"device_type":"ios"
},
{
"id":"6ZvpDPvX",
"device_id":"did_84fdd",
"device_type":"android"
}
]
}
为了解析这种类型的响应,我目前正在使用org.json 方法和 Gson 的组合。
JSONArray jsonResponse = new JSONObject(response).getJSONArray("devices");
Type deviceListType = new TypeToken<List<Device>>() {}.getType();
ArrayList<Device> devices = gson.fromJson(jsonResponse.toString(), deviceListType);
我正在寻找一种更简洁的反序列化方法,因为我想使用 Retrofit。 Get nested JSON object with GSON using retrofit 中的答案接近我所需要的,但不能处理 Lists。我在这里复制了答案的通用版本:
public class RestDeserializer<T> implements JsonDeserializer<T> {
private Class<T> mClass;
private String mKey;
public RestDeserializer(Class<T> targetClass, String key) {
mClass = targetClass;
mKey = key;
}
@Override
public T deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext)
throws JsonParseException {
JsonElement value = jsonElement.getAsJsonObject().get(mKey);
if (value != null) {
return new Gson().fromJson(value, mClass);
} else {
return new Gson().fromJson(jsonElement, mClass);
}
}
}
我的目标是让这个电话“正常工作”。
@GET("/api/v1/protected/devices")
public void getDevices(Callback<List<Device>> callback);
【问题讨论】:
-
不就是一个简单的
List<Device>吗?如果字段名称与 Json 名称不同,只需使用@SerializedName注释即可。 Retrofit 会为你做解析 -
你如何创建和注册你的反序列化器?
-
我目前没有使用反序列化器,因为它实际上并不能解决问题。
-
@MarcoAcierno,我没有包含设备列表的类。我试图避免创建不需要的(希望是不必要的!)包装类。
-
@Derek,你是怎么解决这个问题的。你能发表你的答案吗?
标签: java android json gson retrofit