Moshi无法为通用的类创建转换器

时间:2017-07-18 13:06:40

标签: java android generics retrofit moshi

我服务器的一些成功响应是:

  

{       "错误":null,       "数据":null   }

我的模特是:

public class BaseResponse<E > {

    @Json(name = "error")
    public ErrorModel error;

    @Json(name = "data")
    public E data;
}

如果我的终点是

@POST("user")
Call<BaseResponse<String>> createUser(@Body Credentials credentials);  

这样可行,但String类型无用,因为数据始终为null。但如果我做到了:

@POST("user")
Call<BaseResponse> createUser(@Body Credentials credentials);  

我在

崩溃了
Call<BaseResponse> call = apiService.createUser(creds);

完整日志:

java.lang.IllegalArgumentException: Unable to create converter for 
    class common.model.responses.BaseResponse for method MyEndpoints.createUser
  ...
Caused by: java.lang.IllegalArgumentException: Expected a Class, ParameterizedType, 
   or GenericArrayType, but <null> is of type null
  at com.squareup.moshi.Types.getRawType(Types.java:167)
  at com.squareup.moshi.ClassJsonAdapter$1.createFieldBindings(ClassJsonAdapter.java:83)
  at com.squareup.moshi.ClassJsonAdapter$1.create(ClassJsonAdapter.java:75)
  at com.squareup.moshi.Moshi.adapter(Moshi.java:100)
  at com.squareup.moshi.ClassJsonAdapter$1.createFieldBindings(ClassJsonAdapter.java:91)
  at com.squareup.moshi.ClassJsonAdapter$1.create(ClassJsonAdapter.java:75)
  at com.squareup.moshi.Moshi.adapter(Moshi.java:100)
  at retrofit2.converter.moshi.MoshiConverterFactory.responseBodyConverter(MoshiConverterFactory.java:91)
  at retrofit2.Retrofit.nextResponseBodyConverter(Retrofit.java:330)
  at retrofit2.Retrofit.responseBodyConverter(Retrofit.java:313)
  at retrofit2.ServiceMethod$Builder.createResponseConverter(ServiceMethod.java:736)
 ...

1 个答案:

答案 0 :(得分:1)

此特定错误的表面因为无法知道E字段的类型,因为它未在原始类型用法中指定。

由于您知道此字段将始终为null,因此最佳解决方案是使用其他类型(缺少字段)来澄清这一点。

如果您确实无法使用其他类型,则可以使用Void作为泛型类型参数。您需要在Moshi实例上注册一个JsonAdapter,以便对反序列化的Void字段进行反序列化:new Moshi.Builder().add(VOID_JSON_ADAPTER).build()

static final Object VOID_JSON_ADAPTER = new Object() {
  @FromJson Void fromJson(JsonReader reader) throws IOException {
    return reader.nextNull();
  }

  @ToJson void toJson(JsonWriter writer, Void v) throws IOException {
    writer.nullValue();
  }
};

但是,使用不同的类型最有意义。