Sto utilizzando Retrofit 2
e Gson
e ho problemi a deserializzare le risposte dalla mia API. Ecco il mio piano d'azione:Utilizzo di Gson e Retrofit 2 per deserializzare risposte API complesse
Ho un oggetto del modello di nome Employee
che ha tre campi: id
, name
, age
.
Ho un'API che restituisce un Employee
oggetto singolare come questo:
{
"status": "success",
"code": 200,
"data": {
"id": "123",
"id_to_name": {
"123" : "John Doe"
},
"id_to_age": {
"123" : 30
}
}
}
e un elenco di Employee
oggetti come questo:
{
"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
}
},
]
}
ci sono tre cose principali da considerare qui:
- Le risposte API restituiscono in un wrapper generico, con la parte importante all'interno di e Campo
data
. - I rendimenti API oggetti in un formato che non corrisponde direttamente ai campi del modello (ad esempio, il valore assunto da
id_to_age
esigenze mappare al campoage
del modello) - Il campo
data
nel La risposta API può essere un oggetto singolare o un elenco di oggetti.
Come implementare la deserializzazione con Gson
in modo da gestire elegantemente queste tre custodie?
Idealmente, preferirei farlo interamente con TypeAdapter
o TypeAdapterFactory
invece di pagare la penalità delle prestazioni di JsonDeserializer
. In ultima analisi, voglio finire con un'istanza di Employee
o List<Employee>
tale che soddisfa questa interfaccia:
public interface EmployeeService {
@GET("/v1/employees/{employee_id}")
Observable<Employee> getEmployee(@Path("employee_id") String employeeId);
@GET("/v1/employees")
Observable<List<Employee>> getEmployees();
}
Questa domanda precedente ho postato discute mio primo tentativo di questo, ma non riesce a prendere in considerazione alcuni dei trucchi menzionato sopra: Using Retrofit and RxJava, how do I deserialize JSON when it doesn't map directly to a model object?
si dice "il mio API". Se si ha accesso al back-end, è necessario rendere la serializzazione dell'età e un nome migliore sul lato server. – iagreen
Non ho accesso. Con "mia API" mi riferisco all'API con cui lavoro. – user2393462435
Perché non create Plain Old Java Objects che rappresentano le vostre risposte JSON e quindi le associano alla classe Employee? –