Я использую Retrofit 2
и Gson
, и у меня возникают проблемы с десериализацией ответов от моего API. Вот мой сценарий:Использование Gson и Retrofit 2 для десериализации сложных ответов 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 в общей обертке с важной частью внутри e
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();
}
Это ранее вопрос, который я отправил обсуждает свою первую попытку, но она не учитывает некоторые из подводных камней упомянутый выше: Using Retrofit and RxJava, how do I deserialize JSON when it doesn't map directly to a model object?
Вы говорите, что "мой" API. Если у вас есть доступ к серверу, вы должны сделать сериализацию возраста и имени лучше на стороне сервера. – iagreen
У меня нет доступа. Под «моим API» я имею в виду API, с которым я работаю. – user2393462435
Почему вы не создаете простые старые объекты Java, которые представляют ваши ответы JSON, а затем сопоставляют их со своим классом Employee? –