我正在尝试从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中的答案接近我的需要,但不处理List
。我在这里复制了答案的通用版本:
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);
答案 0 :(得分:1)
使用以下课程
public class Devices {
@Expose
private List<Device> devices = new ArrayList<Device>();
/**
*
* @return
* The devices
*/
public List<Device> getDevices() {
return devices;
}
/**
*
* @param devices
* The devices
*/
public void setDevices(List<Device> devices) {
this.devices = devices;
}
}
设备类
public class Device extends Entity {
@Expose
String id;
@Expose
String device_id;
@Expose
String device_type;
}
或
public class Device extends Entity {
@Expose @SerializedName("id")
String deviceId;
@Expose @SerializedName("device_id")
String devicePushId;
@Expose @SerializedName("device_type")
String deviceType;
}
将改造方法更新为
@GET("/api/v1/protected/devices")
public void getDevices(Callback<Devices> callback);
devices.getDevices() //call inside callback method will give you the list
此外,您不需要自定义反序列化程序