17

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

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

3 回答 3

19

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

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

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

于 2017-10-03T18:12:43.650 回答
0

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

Type type = Types.newParameterizedType(SocketResponse.class, Object.class);
JsonAdapter<SocketResponse<?>> jsonAdapter = moshi.adapter(type);
于 2017-09-13T09:48:42.750 回答
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)

于 2021-07-12T09:16:05.040 回答