1
votes

Comment obtenir des données imbriquées de gson?

J'ai fait une requête get à une API RESTful externe et reçois en réponse un objet json avec cette structure:

    public void testResponse(){
        RestTemplate restTemplate = new RestTemplate();
        Data data = new Data();
        User user = new User();
        Gson gson = new Gson();

        String response = restTemplate.getForObject(
                    "https://apifrommyrequest.com/user/{id}",
                    String.class,
                    73442);
        user = gson.fromJson(response, User.class);
        System.out.println(user);
    }
    ```

My output:
22:20:57.641 [main] DEBUG org.springframework.web.client.RestTemplate - HTTP GET https://apifrommyrequest.com/user/73442
22:20:57.672 [main] DEBUG org.springframework.web.client.RestTemplate - Accept=[text/plain, application/json, application/*+json, */*]
22:20:58.243 [main] DEBUG org.springframework.web.client.RestTemplate - Response 200 OK
22:20:58.247 [main] DEBUG org.springframework.web.client.RestTemplate - Reading to [java.lang.String] as "application/json;charset=UTF-8"
Data(id=0, name=null, urlPicture=null, country=null)

I really don't know how to do anymore.

Je n'ai pas besoin de tout ce que contient cette réponse, je n'en veux que champs à enregistrer dans une base de données.

Mes classes POJO sont similaires à ce pseudocode:

    public class Data{
        private User user;

        // getters and setters
    }

    public class User{
        private int id;
        private String name;
        private String urlPicture;
        private String country;

        // getters and setters
    }

Mais, lorsque j'essaye d'extraire les champs que je veux, Je reçois null dans ces champs

{
    "data": {
       "id": 1,
       "name": "John Doe",
       "email": "doe@john.com",
       "urlPicture": "urlPicture.com/82819",
       "address": {
          "street": "My street",
          "number": "29",
          "city": "Nurnberg",
          "country": "Germany"
       }
    }
}


5 commentaires

Ce n'est pas du JSON valide. country dans User ne fonctionnera pas, car il fait partie d'un sous-objet.


Donc, j'ai besoin de construire une classe interne pour un objet imbriqué, non? Alors, pourquoi les autres données ne fonctionnent pas?


Je ne sais pas à quoi ressemble vraiment la réponse, donc je ne peux pas le dire. Veuillez corriger le JSON dans votre exemple.


Ok, je vais essayer de le réparer, si continuez à donner une erreur, je modifierai la question. Merci


Pour commencer, imprimez votre réponse . Et RestTemplate est capable de faire la désérialisation pour vous.


3 Réponses :


5
votes

Essayez le code ci-dessous. Vous ne pouvez pas accéder directement au pays, c'est une valeur placée dans un objet imbriqué. Et puisque le corps de la réponse est renvoyé sous forme de données, vous ne pouvez pas le convertir en objet User. tout d'abord, vous devez le convertir en objet Data.

public class User {
    private int id;
    private String name;
    private String urlPicture;
    private Address address;

    // getters and setters
}

public class Address {
    private String country;

    // getters and setters
}

public void testResponse(){
    RestTemplate restTemplate = new RestTemplate();
    Data data = new Data();
    User user = new User();
    Gson gson = new Gson();

    String response = restTemplate.getForObject(
                "https://apifrommyrequest.com/user/{id}",
                String.class,
                73442);
    data = gson.fromJson(response, Data.class);

    System.out.println(data);
}


0 commentaires

0
votes

vous n'avez pas vraiment besoin de faire la conversion de chaîne en objet, resttemplate utilise déjà jackson qui le fait pour vous, il suffit de

YourObject response = restTemplate.getForObject(
                    "https://apifrommyrequest.com/user/{id}",
                    YourObject.class,
                    73442);

puis il va faire le mappage vers votre objets pojo, vous n'avez pas vraiment besoin de gson dans ce scénario.


0 commentaires

1
votes

Si vous le souhaitez, vous pouvez également concevoir votre POJO comme ceci (pour réduire les POJO imbriqués):

public class Data {
    private User data;

   //getters and setters
}

public class User {

    private int id;
    private String name;
    private String urlPicture;
    private String country;

    @JsonProperty("address")
    private void unpackNested(Map<String,String> elements)
    {
        this.country = elements.get("country");

    }
   //getters and setters
}

Puis enfin désérialiser sur la classe Data


0 commentaires