Moshi通用型适配器

时间:2017-09-13 09:08:45

标签: java android gson moshi

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

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);
}

3 个答案:

答案 0 :(得分:10)

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

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

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

答案 1 :(得分:0)

我主要使用GSON,但也许是这样的?

Type type = Types.newParameterizedType(SocketResponse.class, Object.class);
JsonAdapter<SocketResponse<?>> jsonAdapter = moshi.adapter(type);

答案 2 :(得分:0)

只是为了更复杂的情况,如果 T 等于这样的泛型类型 List<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)