У меня есть несколько ответов API в этом формате:Пользовательские GSON deserialiser
{
status: "OK",
error: null,
data: [
]
}
Где «данные» поле отличается (один элемент и список элементов) ... Так что я написал обычай десериализатор:
public class CustomDeserializer<T> implements JsonDeserializer<ServerResponse<T>> {
private Type t;
public CustomDeserializer() {
}
public CustomDeserializer(Type t) {
this.t = t;
}
@Override
public ServerResponse<T> deserialize(JsonElement je, Type type, JsonDeserializationContext jdc)
throws JsonParseException {
Gson gson = new Gson();
ServerResponse<T> serverResponse = new ServerResponse<>();
serverResponse.setError(gson.fromJson(je.getAsJsonObject(), Error.class));
serverResponse.setStatus(gson.fromJson(je.getAsJsonObject(), ResponseStatus.class));
if (je.getAsJsonObject().get("data").isJsonArray()) {
JsonArray arr = je.getAsJsonObject().getAsJsonArray("data");
T[] a = (T[]) new Object[arr.size()];
for (int i = 0; i < arr.size(); i++) {
a[i] = gson.fromJson(arr.get(i), t);
}
((ServerResponse<List<T>>) serverResponse).setData(Arrays.asList(a));
return serverResponse;
} else {
T data = gson.fromJson(je.getAsJsonObject().get("data"), t);
serverResponse.setData(data);
return serverResponse;
}
}
}
установкиGson:
Gson gson = new GsonBuilder()
.registerTypeAdapter(ServerResponse.class, new CustomDeserializer<Category>(Category.class))
.registerTypeAdapter(ServerResponse.class, new CustomDeserializer<City>(City.class))
.registerTypeAdapter(ServerResponse.class, new CustomDeserializer<Business>(Business.class))
.registerTypeAdapter(ServerResponse.class, new CustomDeserializer<BusinessListItem>(BusinessListItem.class))
.create();
Но когда приходит ответ ... десериализатор десериализует его в неправильном классе ...
Есть ли у вас какие-либо предложения, как я могу исправить эту проблему?
Пожалуйста, покажите, как вы называете Гсоном заниматься десериализацией. – sargue
@Seishin я понял, что ответ можно упростить, если вы предоставите свой тип объекта gson. А также здесь есть простой вопрос: http://stackoverflow.com/q/36614097/1032167, и, как вы можете видеть из комментариев к первому ответу, вам, вероятно, все равно придется использовать определенный тип запроса объекта, который вы хотите десериализовать. – varren
@ varren, у меня есть 4 разных типа ответа для поля данных. Два из них - это списки объектов. Проблема в том, что десериализатор не знает, какой тип выбрать и десериализовать. Я добавил в вопрос настройку Gson. – Seishin