簡體   English   中英

使用 Gson 和 Retrofit2 有沒有辦法編寫“通用”TypeConverter 來從信封中檢索有效負載?

[英]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 將其正確反序列化為DogCatOrangutan ),但不適用於泛型類型(這是我需要的通用有效載荷。

我可以為每個可能的有效載荷注冊一個類型適配器,但這太瘋狂了,我有超過 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 中使用多個轉換器,這很棒,它只需按順序檢查轉換器,直到找到合適的轉換器。

資源: 編寫自定義 Retrofit 轉換器使用多個轉換器

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM