对包装的对象列表进行GSON反序列化

时间:2015-06-03 15:32:45

标签: java android json gson retrofit

我正在尝试从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);

1 个答案:

答案 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

此外,您不需要自定义反序列化程序