gpt4 book ai didi

java - 使用 Gson 和 Retrofit2 有没有办法编写一个 "generic"类型转换器来从信封中检索有效负载?

转载 作者:行者123 更新时间:2023-11-29 19:11:37 25 4
gpt4 key购买 nike

我有这个responsebody

{
"status":"OK",
"payload":{}
}

有效负载是通用的(java 表示形式看起来像 this)

converter Retrofit1 的东西,但 Retrofit2 似乎不允许您通用地执行此操作,只能针对特定类型执行此操作,当您有 70 多个不同的响应主体时,这不是一个选项。


编辑:

由于这里似乎存在混淆,我不打算将 json 字符串转换为对象。

当我得到前面提到的 ResponseBody 时,我希望能够在我的 Retrofit-interface 中编写以下内容

@POST("someAddress")
SomeResponse getData();

代替

@POST("someAddress")
ResponseWrapper<SomeResponse> getData();

Gson 的 TypeAdapter 可以为确定类型执行此操作(如“我有一个类 Animal 并且需要 GSON 将其正确反序列化为 DogCatOrangutan),但不适用于泛型类型(这是我的泛型负载所需要的。

我可以为每个可能的有效载荷注册一个类型适配器,但这太疯狂了,我有超过 70 个不同的有效载荷对象

最佳答案

Retrofit 通过将其委托(delegate)给 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 中使用多个转换器,这很棒,它只需按顺序检查转换器,直到找到合适的转换器。

资源:writing custom Retrofit converter , using multiple converters

关于java - 使用 Gson 和 Retrofit2 有没有办法编写一个 "generic"类型转换器来从信封中检索有效负载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45095783/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com