Я использую Retrofit 2 и Gson, и у меня возникают проблемы с десериализацией ответов от моего API. Вот мой сценарий:
У меня есть объект модели с именем Employee
который имеет три поля: id
, name
, age
.
У меня есть API, который возвращает отдельный объект Employee
как это:
{
"status": "success",
"code": 200,
"data": {
"id": "123",
"id_to_name": {
"123" : "John Doe"
},
"id_to_age": {
"123" : 30
}
}
}
И список объектов Employee
таких как:
{
"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
}
},
]
}
Здесь нужно учесть три основных момента:
- Ответы API возвращаются в универсальной оболочке с важной частью внутри поля
data
. - API возвращает объекты в формате, который не соответствует непосредственно полям модели (например, значение, взятое из
id_to_age
должно быть сопоставлено с полемage
модели) - Поле
data
в ответе API может быть единичным объектом или списком объектов.
Как реализовать десериализацию с помощью Gson
, чтобы он элегантно обрабатывал эти три случая?
В идеале, я бы предпочел сделать это полностью с TypeAdapter
или TypeAdapterFactory
вместо того, чтобы платить штраф за производительность JsonDeserializer
. В конечном итоге я хочу получить экземпляр Employee
или List<Employee>
, который удовлетворяет следующему интерфейсу:
public interface EmployeeService {
@GET("/v1/employees/{employee_id}")
Observable<Employee> getEmployee(@Path("employee_id") String employeeId);
@GET("/v1/employees")
Observable<List<Employee>> getEmployees();
}
Этот предыдущий вопрос, который я опубликовал, обсуждает мою первую попытку сделать это, но он не учитывает некоторые из упомянутых выше ошибок: используя Retrofit и RxJava, как мне десериализовать JSON, когда он не отображается непосредственно на объект модели?