Получить JSONObject от Retrofit2 - PullRequest
0 голосов
/ 08 января 2019

Я использую модификацию и хочу получить простой JSONObject. Не объектная модель ... фактический объект JSONObject.

Я пытался использовать Call<JSONObject> и Call<ResponseBody> без удачи. Ответы успешны, но тело пусто. Я подтвердил, что ответ в почтальоне НЕ пуст.

Как бы мне этого добиться?

1 Ответ

0 голосов
/ 09 января 2019

Если ваша цель - проверить содержимое ответа перед синтаксическим анализом, вы можете использовать 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...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...