我使用的是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類? –