gson 莫希通用型适配器

wz3gfoph  于 2022-11-06  发布在  其他
关注(0)|答案(3)|浏览(183)

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

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

我知道在运行时T是什么类型。莫希支持泛型类型适配器的方式和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);
}
h5qlskok

h5qlskok1#

与Gson的TypeToken API相比,莫希使用Types上的工厂方法来获取Java类型。

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

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

gzjq41n4

gzjq41n42#

对于更复杂的情况,如果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)
ehxuflar

ehxuflar3#

我主要使用GSON,但也许类似的东西?

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

相关问题