莫希通用型适配器

2022-09-02 13:23:36

假设具有以下表示服务器响应的参数化数据类:

public class SocketResponse<T> {
    private String responseMessage;
    private int responseCode;
    private T entity;
}

我知道在运行时T会是什么类型。moshi 是否支持与 Gson 相同的通用类型适配器?使用Gson id执行以下操作来解析它。

Type typeA = new TypeToken<SocketResponse<MyResponseA>>(){}.getType();
SocketResponse<MyResponseA> responseA = getResponse("json", typeA);

Type typeB = new TypeToken<SocketResponse<MyResponseB>>(){}.getType();
SocketResponse<MyResponseB> responseB = getResponse("json", typeB);


private String getResponse(Type t){
    return gson.fromJson(response, type);
}

答案 1

Moshi 使用 Types 上的工厂方法来获取 Java Types,这与 Gson 的 TypeToken API 形成鲜明对比。

Type typeA = Types.newParameterizedType(SocketResponse.class, MyResponseA.class);
JsonAdapter<SocketResponse<MyResponseA>> adapter = moshi.adapter(typeA);

然后,使用 JsonAdapter 反序列化和序列化您的类型,就像 Gson 的 TypeAdapter 一样。


答案 2

只是对于更复杂的情况,如果等于像这样的泛型类型。例如,您可以执行此操作(在):TList<MyResponseA>kotlin

val t = Types.newParameterizedType(
    SocketResponse::class.java, Types.newParameterizedType(
        List::class.java,
        MyResponseA::class.java
    )
)
val adapter = moshi.adapter<SocketResponse<List<MyResponseA>>>(t)


推荐