我正在使用我的android应用程序的API,所有JSON响应都是这样的:
{
'status': 'OK',
'reason': 'Everything was fine',
'content': {
< some data here >
}
问题是我所有的POJO都有一个status
,reason
字段,在content
字段中是我想要的真正的POJO。
有没有办法创建一个自定义的Gson转换器来提取始终的content
字段,以便retrofit返回适当的POJO?
发布于 2016-11-19 18:24:17
有点晚了,但希望这能帮助一些人。
只需创建以下TypeAdapterFactory即可。
public class ItemTypeAdapterFactory implements TypeAdapterFactory {
public <T> TypeAdapter<T> create(Gson gson, final TypeToken<T> type) {
final TypeAdapter<T> delegate = gson.getDelegateAdapter(this, type);
final TypeAdapter<JsonElement> elementAdapter = gson.getAdapter(JsonElement.class);
return new TypeAdapter<T>() {
public void write(JsonWriter out, T value) throws IOException {
delegate.write(out, value);
}
public T read(JsonReader in) throws IOException {
JsonElement jsonElement = elementAdapter.read(in);
if (jsonElement.isJsonObject()) {
JsonObject jsonObject = jsonElement.getAsJsonObject();
if (jsonObject.has("content")) {
jsonElement = jsonObject.get("content");
}
}
return delegate.fromJsonTree(jsonElement);
}
}.nullSafe();
}
}
并将其添加到GSON构建器中:
.registerTypeAdapterFactory(new ItemTypeAdapterFactory());
或
yourGsonBuilder.registerTypeAdapterFactory(new ItemTypeAdapterFactory());
发布于 2014-12-16 05:13:49
延续Brian的想法,因为我们几乎总是有许多REST资源,每个REST资源都有自己的根,所以推广反序列化可能会很有用:
class RestDeserializer<T> implements JsonDeserializer<T> {
private Class<T> mClass;
private String mKey;
public RestDeserializer(Class<T> targetClass, String key) {
mClass = targetClass;
mKey = key;
}
@Override
public T deserialize(JsonElement je, Type type, JsonDeserializationContext jdc)
throws JsonParseException {
JsonElement content = je.getAsJsonObject().get(mKey);
return new Gson().fromJson(content, mClass);
}
}
然后,为了解析上面的样本有效负载,我们可以注册GSON反序列化器:
Gson gson = new GsonBuilder()
.registerTypeAdapter(Content.class, new RestDeserializer<>(Content.class, "content"))
.build();
发布于 2016-10-26 13:02:53
更好的解决方案可能是这样的..
public class ApiResponse<T> {
public T data;
public String status;
public String reason;
}
然后,像这样定义您的服务。
Observable<ApiResponse<YourClass>> updateDevice(..);
https://stackoverflow.com/questions/23070298
复制相似问题