Я использую Retrofit (в сочетании с OkHttp и GSON) для связи с онлайн-сервисом. вебсервиса имеет оболочку по умолчанию вокруг всех этих ответов, похожую на:GSON игнорирует элементы с неправильным типом
{
"resultCode":"OK",
"resultObj":"Can be a string or JSON object/array",
"error":"",
"message":""
}
В этом примере resultCode
будет либо OK
или NO
. Кроме того, error
и message
имеют только содержимое, если при обработке запроса произошла ошибка. И последнее, но не менее важное: resultObj
будет содержать фактический результат вызова (который является строкой в примере, но некоторые вызовы возвращают массив JSON или объект JSON).
Чтобы обработать этот мета-данные, я создал универсальный класс, как этот:
public class ApiResult<T> {
private String error;
private String message;
private String resultCode;
private T resultObj;
// + some getters, setters etcetera
}
Я также создал классы, которые представляют ответы иногда приведенные в resultObj
и я определил интерфейс для использования с Модернизированным, что выглядит как это:
public interface SomeWebService {
@GET("/method/string")
ApiResult<String> someCallThatReturnsAString();
@GET("/method/pojo")
ApiResult<SomeMappedResult> someCallThatReturnsAnObject();
}
пока запрос действует это все работает отлично. Но когда ошибка возникает на стороне сервера, она все равно вернет код resultObj
со строковым типом. Это приводит someCallThatReturnsAnObject
к сбою в библиотеке дооснащения RestAdapter/GSON, с сообщением вроде этого:
retrofit.RetrofitError: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException:
Expected BEGIN_OBJECT but was STRING at line 1 column 110 path $.resultObj
Теперь, наконец, мои вопросы:
- Есть ли (простой) способ сказать GSON что он должен просто игнорировать (ака «nullify») свойство, если оно не соответствует ожидаемому типу?
- Могу ли я сказать, что GSON обрабатывает пустые строки как null?
Я больше не активно работаю над этим проектом. Если у меня останется свободное время, я попытаюсь подтвердить ваш ответ. –
Работающ awesome, спасибо –
так как вы получаете String из resultObj? –