![](/img/trans.png)
[英]Add two more values in POJO based on a value from the API while setting it - Retrofit2 & Gson converter
[英]With Gson and Retrofit2 Is there a way to write a "generic" TypeConverter to retrieve the payload from an envelope?
我有這個響應體
{
"status":"OK",
"payload":{}
}
其中有效負載是通用的(java 表示看起來像這樣)
有用於 Retrofit1 的轉換器,但 Retrofit2 似乎不允許您通用地執行此操作,只能針對特定類型執行此操作,當您有 70 多個不同的響應體時,這不是一個選項。
編輯:
由於這里似乎存在混淆,我不打算將 json 字符串轉換為對象。
當我得到前面提到的 ResponseBody 時,我希望能夠在我的 Retrofit-interface 中編寫以下內容
@POST("someAddress")
SomeResponse getData();
代替
@POST("someAddress")
ResponseWrapper<SomeResponse> getData();
有適用於 Gson 的 TypeAdapter 可以針對確定類型執行此操作(如“我有一個類Animal
並且需要 GSON 將其正確反序列化為Dog
, Cat
和Orangutan
),但不適用於泛型類型(這是我需要的通用有效載荷。
我可以為每個可能的有效載荷注冊一個類型適配器,但這太瘋狂了,我有超過 70 個不同的有效載荷對象
你試過GsonConverterFactory類嗎? 我的反應比你的更復雜,但它仍然可以准確地轉換。 這個轉換器庫也是Retrofit團隊自己創建的。
new Retrofit.Builder()
.baseUrl(url)
.addConverterFactory(GsonConverterFactory.create())
.build();
Retrofit 通過將其委托給 Converter 來完成序列化部分,您可以使用 builder.addConverterFactory(GsonConverterFactory.create()) 將特定的一個添加到構建器並且已經有很多書面的 Retrofit Converters,您可以找到其中的大部分這里。
所以如果你想控制這個反序列化過程,你可以寫你的自定義轉換器,像這樣
public class UnwrapConverterFactory extends Converter.Factory {
private GsonConverterFactory factory;
public UnwrapConverterFactory(GsonConverterFactory factory) {
this.factory = factory;
}
@Override
public Converter<ResponseBody, ?> responseBodyConverter(final Type type,
Annotation[] annotations, Retrofit retrofit) {
// e.g. WrappedResponse<Person>
Type wrappedType = new ParameterizedType() {
@Override
public Type[] getActualTypeArguments() {
// -> WrappedResponse<type>
return new Type[] {type};
}
@Override
public Type getOwnerType() {
return null;
}
@Override
public Type getRawType() {
return WrappedResponse.class;
}
};
Converter<ResponseBody, ?> gsonConverter = factory
.responseBodyConverter(wrappedType, annotations, retrofit);
return new WrappedResponseBodyConverter(gsonConverter);
}
}
然后你再次使用 addConverterFactory() 來告訴 Retrofit 關於新轉換器的信息。 我應該提一下,你可以在 Retrofit 中使用多個轉換器,這很棒,它只需按順序檢查轉換器,直到找到合適的轉換器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.