假设有以下参数化数据类表示服务器响应:
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);
}
答案 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)