带Gson的动态属性类型

时间:2018-04-05 17:48:37

标签: android gson retrofit

我正在使用Retrofit来请求API,但我的响应有问题。当属性为空时,它返回[],否则返回Map<String, MyObject>。在两种情况下,如何解析对Object的响应?

1 个答案:

答案 0 :(得分:1)

快速型适配器可以解决这个问题。例如,

class EmptyArrayAdapter<T> implements JsonDeserializer<T> {

  @Override
  public T deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext jsc) throws JsonParseException {

    if (json.isJsonArray()) {
      // It is an array instead of a Map, 
      // Return an empty object (could also just return null)
      return jsc.deserialize(new JsonObject(), typeOfT);
    } else {
      return jsc.deserialize(json, typeOfT);
    }
  }
}

注意,由于此适配器使用的jsc.deserialize类型与传递的类型相同,因此您必须通过字段上的@JsonAdapter注释使用它 -

class MyObject {
  @JsonAdapter(EmptyArrayAdapter.class)
  Map<String, SomeObj> myField;
}