I'm using Retrofit 2 and Gson and I'm having trouble deserializing responses from my API. Here's my scenario:
I have a model object named Employee
that has three fields: id
, name
, age
.
I have an API that returns a singular Employee
object like this:
{
"status": "success",
"code": 200,
"data": {
"id": "123",
"id_to_name": {
"123" : "John Doe"
},
"id_to_age": {
"123" : 30
}
}
}
And a list of Employee
objects like this:
{
"status": "success",
"code": 200,
"data": [
{
"id": "123",
"id_to_name": {
"123" : "John Doe"
},
"id_to_age": {
"123" : 30
}
},
{
"id": "456",
"id_to_name": {
"456" : "Jane Smith"
},
"id_to_age": {
"456" : 35
}
},
]
}
There are three main things to consider here:
- API responses return in a generic wrapper, with the important part inside of the
data
field.
- The API returns objects in a format that doesn't directly correspond to the fields on the model (for example, the value taken from
id_to_age
needs be mapped to the age
field on the model)
- The
data
field in the API response can be a singular object, or a list of objects.
How do I implement deserialization with Gson
such that it handles these three cases elegantly?
Ideally, I'd prefer to do this entirely with TypeAdapter
or TypeAdapterFactory
instead of paying the performance penalty of JsonDeserializer
. Ultimately, I want to end up with an instance of Employee
or List<Employee>
such that it satisfies this interface:
public interface EmployeeService {
@GET("/v1/employees/{employee_id}")
Observable<Employee> getEmployee(@Path("employee_id") String employeeId);
@GET("/v1/employees")
Observable<List<Employee>> getEmployees();
}
This earlier question I posted discusses my first attempt at this, but it fails to consider a few of the gotchas mentioned above:
Using Retrofit and RxJava, how do I deserialize JSON when it doesn't map directly to a model object?
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…