I'm using Retrofit (in combination with OkHttp and GSON) to communicate with an online webservice. The webservice has a default wrapper around all it's responses, similar to:
{
"resultCode":"OK",
"resultObj":"Can be a string or JSON object / array",
"error":"",
"message":""
}
In this example resultCode
will either be OK
or NO
. Furthermore error
and message
only have any contents when an error has occured while processing the request. And last, but not least, resultObj
will contain the actual result from the call (which is a string in the example, but some calls return a JSON array or a JSON object).
To process this meta data, I created a generic class, like this one:
public class ApiResult<T> {
private String error;
private String message;
private String resultCode;
private T resultObj;
// + some getters, setters etcetera
}
I've also created classes that represent the responses sometimes given in resultObj
and I've defined an interface for use with Retrofit, that looks a bit like this:
public interface SomeWebService {
@GET("/method/string")
ApiResult<String> someCallThatReturnsAString();
@GET("/method/pojo")
ApiResult<SomeMappedResult> someCallThatReturnsAnObject();
}
As long as the request is valid this all works fine. But when an error occurs on the server side, it will still return a resultObj
with a String-type. This causes someCallThatReturnsAnObject
to crash inside the Retrofit RestAdapter / GSON library, with a message like this:
retrofit.RetrofitError: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException:
Expected BEGIN_OBJECT but was STRING at line 1 column 110 path $.resultObj
Now, finally, my questions are:
- Is there an (easy) way to tell GSON that it should just ignore (aka "nullify") a property if it does not match the expected type?
- Can I tell GSON to treat empty strings as null?