- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有这个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 将其正确反序列化为 Dog
,Cat
和 Orangutan
),但不适用于泛型类型(这是我的泛型负载所需要的。
我可以为每个可能的有效载荷注册一个类型适配器,但这太疯狂了,我有超过 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/
我是一名优秀的程序员,十分优秀!