Utiliser Gson et Retrofit 2 pour désérialiser les réponses d'API complexes

Je suis en utilisant Retrofit 2 et Gson et je vais avoir de la difficulté à la désérialisation des réponses de mon API. Voici mon scénario:

J'ai un modèle objet nommé Employee qui a trois champs: idnameage.

J'ai une API qui renvoie un singulier Employee objet comme ceci:

{
    "status": "success",
    "code": 200,
    "data": {
        "id": "123",
        "id_to_name": {
            "123" : "John Doe"
        },
        "id_to_age": {
            "123" : 30
        }
    }
}

Et une liste de Employee objets comme ceci:

{
    "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
            }
        },
    ]
}

Il y a trois choses à considérer ici:

  1. API réponses de retour dans un wrapper générique, à la part importante à l'intérieur de la data champ.
  2. L'API retourne des objets dans un format qui n'est pas directement correspondent aux champs du modèle (par exemple, la valeur prise dans id_to_age doit être mappé à la age champ sur le modèle)
  3. La data champ dans l'API de réponse peut être un objet singulier, ou une liste d'objets.

Comment puis-je mettre en œuvre la désérialisation avec Gson tel qu'il gère ces trois cas élégamment?

Idéalement, je préfère le faire entièrement avec TypeAdapter ou TypeAdapterFactory au lieu de payer l'amende de la performance de JsonDeserializer. En fin de compte, j'ai envie de finir avec une instance de Employee ou List<Employee> tel qu'il répond à cette interface:

public interface EmployeeService {

    @GET("/v1/employees/{employee_id}")
    Observable<Employee> getEmployee(@Path("employee_id") String employeeId);

    @GET("/v1/employees")
    Observable<List<Employee>> getEmployees();

}

Cette question précédente, j'ai posté discute de ma première tentative à cet égard, mais il ne parvient pas à envisager de quelques-uns des problèmes évoqués ci-dessus:
À l'aide de Rénovation et de RxJava, comment puis-je désérialiser JSON quand il n'est pas directement un objet de modèle?

source d'informationauteur user2393462435