Я использую Retrofit (в сочетании с OkHttp и GSON), чтобы общаться с онлайн-сервисом. Webservice имеет обертку по умолчанию для всех ответов, аналогичную:
{
"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
, и я определил интерфейс для использования с Retrofit, который выглядит примерно так:
public interface SomeWebService {
@GET("/method/string")
ApiResult<String> someCallThatReturnsAString();
@GET("/method/pojo")
ApiResult<SomeMappedResult> someCallThatReturnsAnObject();
}
Пока запрос действителен, все работает нормально. Но когда ошибка возникает на стороне сервера, она все равно вернет resultObj
с типом String. Это приводит к сбою someCallThatReturnsAnObject
внутри библиотеки RetoFit RestAdapter/GSON с сообщением типа:
retrofit.RetrofitError: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException:
Ожидаемый BEGIN_OBJECT, но был STRING в строке 1 столбец 110 путь $.resultObj
Теперь, наконец, мои вопросы:
- Есть ли (простой) способ сообщить GSON, что он должен просто игнорировать (иначе называемый "nullify" ) свойство, если оно не соответствует ожидаемому типу?
- Могу ли я сказать GSON, чтобы обрабатывать пустые строки как null?