我使用的是Retrofit 2
和Gson
,并且我在解析API反应时遇到了麻烦。这是我的场景:使用Gson和Retrofit 2来反序列化复杂的API响应
我有一个名为Employee
的模型对象,它有三个字段:id
,name
,age
。
我有一个返回单一Employee
对象像这样的API:
{
"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
为什么不创建表示您的JSON响应的Plain Old Java对象,然后将这些对象映射到您的Employee类? –