从Retrofit2获取JSONObject

时间:2019-01-08 19:15:33

标签: android retrofit2

我正在使用改造,并希望返回一个简单的JSONObject。不是对象模型,而是实际的JSONObject对象。

我尝试使用Call<JSONObject>Call<ResponseBody>时没有运气。响应成功,但正文为空。我确认邮递员的回复不为空。

我该怎么做?

1 个答案:

答案 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...
}