我正在使用改造,并希望返回一个简单的JSONObject。不是对象模型,而是实际的JSONObject对象。
我尝试使用Call<JSONObject>
和Call<ResponseBody>
时没有运气。响应成功,但正文为空。我确认邮递员的回复不为空。
我该怎么做?
答案 0 :(得分:0)
如果您的目标是在解析之前检查响应的内容,则可以将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();
}
这些用于您的已解析对象。由于您有两种类型的响应,因此可以根据继承ParsedObject.class
的响应类型来创建2个saperate类。
TypeOneResponse.class
public class TypeOneResponse extends ParsedObject {
// fields, constructors, getters/setters..
@Overried
public int getResponseType() {
return RESPONSE_TYPE_1;
}
}
您可以对TypeTwoResponse.class执行相同的操作,但为getResponseType()方法返回RESPONSE_TYPE_2。
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...
}