Если ваша цель - проверить содержимое ответа перед синтаксическим анализом, вы можете использовать JsonDeserializer вместе с библиотекой Gson. Если вы еще не внедрили Gson, добавьте его в gradle уровня приложения:
implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
В вашем коде:
public Retrofit provideRetrofit() {
Gson gson = new GsonBuilder().registerTypeAdapter(ParsedObject.class, new MyDeserializer()).create();
return new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create(gson))
.baseUrl(BASE_URL)
.build();
}
ParsedObject.class
public abstract class ParsedObject {
public static final int RESPONSE_TYPE_1 = 1;
public static final int RESPONSE_TYPE_2 = 2;
abstract public int getResponseType();
}
Это для ваших проанализированных объектов. Поскольку у вас есть 2 типа ответов, вы можете создать 2 отдельных класса в зависимости от типа ответа, который наследует ParsedObject.class
.
TypeOneResponse.class
public class TypeOneResponse extends ParsedObject {
// fields, constructors, getters/setters..
@Overried
public int getResponseType() {
return RESPONSE_TYPE_1;
}
}
вы можете сделать то же самое для вашего TypeTwoResponse.class, но вернув RESPONSE_TYPE_2 для метода getResponseType ().
MyDeserializer.class
public class CurrentPriceDeserializer implements MyDeserializer {
@Override
public Object deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
// Now, check the Json respons using the raw json (JsonElement) parameter.
// Determine if it is type 1 or 2.
boolean isTypeOne = checkResponseType()
// Deserialize or manually parse objects...
return isTypeOne ? resultTypeOne : resultTypeTwo;
}
}
И, наконец, в вашем обратном вызове Retrofit
ParsedObject result = deserializedResult;
if (result.getResponseType() == RESPONSE_TYPE_1) {
// cast the object to TypeOneResponse or use it accordingly...
} else {
// case the object to TypeTwoResponse or use it accordingly...
}