Parser un json à plusieurs noeuds

Résolu
polak1982 Messages postés 7 Date d'inscription   Statut Membre Dernière intervention   -  
polak1982 Messages postés 7 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,
Je demande de l'aide de la commuanute, en effet je souhaite implementer un algo Java pour parser le json suivant :

{
   "title":" La Famille",
   "id_tavle":"201939OTTO_2_PA",
   "root":[
      {
         "title":" Nouvelles",
         "children":[
            {
               "title":" Tres rapide",
               "children":[
                  {
                     "title":" Chantier de construction",
                     "children":[
                        {
                           "title":" Faut-il construire des hotels paticuliers ?",
                           "id_tavle":"201939OTTO_2_PA"
                        }
                     ]
                  }
               ]
            }
         ]
      },
      {
         "title":" Intox",
         "children":[
            {
               "title":" Tres faux",
               "children":[
                  {
                     "title":" Chantier de demolition",
                     "children":[
                        {
                           "title":" Faut-il detruire des hotels paticuliers ?",
                           "children":[
                              {
                                 "title":" Faut-il detruire des hotels paticuliers ?",
                                 "id_tavle":"201939OTTO_2_PA"
                              }
                           ]
                        }
                     ]
                  }
               ]
            }
         ]
      }
   ]
}


Afin d'obtenir le resultat suivant :
La Famille
Nouvelles
Tres rapide
Chantier de construction
<a>Faut-il construire des hotels paticuliers ?</a>
<a>Faut-il construire des hotels paticuliers ?</a>

Intox
Tres faux
Chantier de demolition
Faut-il detruire des hotels paticuliers ?
<a>Faut-il construire des hotels paticuliers ?</a>


Merci par avance,

1 réponse

  1. KX Messages postés 19031 Statut Modérateur 3 020
     
    Bonjour

    Tu peux regarder cet outil : https://www.jsonschema2pojo.org
    Il va générer du code Java qui correspond à ton JSON, par exemple avec les annotations Jackson.

    Voir ensuite ici pour manipuler Jackson :
    https://www.baeldung.com/jackson-object-mapper-tutorial
    2
    1. polak1982 Messages postés 7 Date d'inscription   Statut Membre Dernière intervention  
       
      Bonjour KX,

      EN fait mon Json n'est mas statique. Je les récupère de la base de données et n'ont pas les mêmes tailles . J'ai voulu faire ceci :

       public void getJsonToHtml(String json) throws JSONException {
              StringBuilder ret = new StringBuilder();
              JSONObject tocRevue = new org.json.JSONObject(json);
      
              if(hasKey(tocRevue, "title")){
                  ret.append(tocRevue.get("title")).append("\n").append("\t");
              }
              JSONArray nodes = tocRevue.getJSONArray("root");
      
              for (int i = 0; i < nodes.length(); i++) {
                  JSONObject child = nodes.getJSONObject(i);
                  if(hasKey(child, "children")){
                      ret.append(child.get("title")).append("\n").append("\t");
                  }
                  JSONArray node = (JSONArray) child.get("children");
                  log.info("node " + node);
              }
              log.info("retour " + ret);
          }
          private boolean hasKey(JSONObject jsonObject, String key) {
              return jsonObject != null && jsonObject.has(key);
          }

      Mais le résultat qui m'est renvoyé n'est pas le bon:
        La Famille
      Nouvelles

      Or je souhaite obtenir :
      La Famille
      Nouvelles
      Tres rapide
      Chantier de construction
      <a>Faut-il construire des hotels paticuliers ?</a>
      <a>Faut-il construire des hotels paticuliers ?</a>

      Intox
      Tres faux
      Chantier de demolition
      Faut-il detruire des hotels paticuliers ?
      <a>Faut-il construire des hotels paticuliers ?</a>
      0
      1. KX Messages postés 19031 Statut Modérateur 3 020 > polak1982 Messages postés 7 Date d'inscription   Statut Membre Dernière intervention  
         
        "EN fait mon Json n'est mas statique."
        Un JSON est forcément prévisible ou alors on ne pourra pas en extraire ses informations, ce qui serait dommage vu que la raison d'être du JSON est de transporter de l'information et donc de pouvoir être lu comme il a été écrit.

        Dans ton cas, il s'agit juste de jouer un peu avec la récursivité de la donnée :
        import java.util.List;
        import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
        @JsonIgnoreProperties(ignoreUnknown = true)
        public class Data {
            public String title;
            public List<Data> root;
            public List<Data> children;
        }

        import java.io.File;
        import java.util.List;
        import com.fasterxml.jackson.databind.ObjectMapper;
        public class Main {
            public static void main(String[] args) throws Exception {
                ObjectMapper objectMapper = new ObjectMapper();
                Data data = objectMapper.readValue(new File("D:/datas.json"), Data.class);
                display(data, "");
            }
            public static void display(Data data, String prefix) {
                if (data == null)
                    return;
                System.out.println(prefix + data.title);
                display(data.root, prefix + "  ");
                display(data.children, prefix + "  ");
            }
            public static void display(List<Data> datas, String prefix) {
                if (datas == null)
                    return;
                for (Data data : datas)
                    display(data, prefix);
            }
        }
        0
      2. polak1982 Messages postés 7 Date d'inscription   Statut Membre Dernière intervention   > KX Messages postés 19031 Statut Modérateur
         
        Merci beaucoup KX,

        J'arrive à afficher les résultats dans la console comme convenu. J'ai juste une dernière question :

        Comment stocker mes résultats dans un StringBuilder ?

        Merci par avance,
        0
      3. KX Messages postés 19031 Statut Modérateur 3 020 > polak1982 Messages postés 7 Date d'inscription   Statut Membre Dernière intervention  
         
        Exactement de la même manière que le paramètre String prefix augmente sa valeur au fur et à mesure du traitement tu peux rajouter un paramètre qui te sert à accumuler ton résultat.
        0
      4. polak1982 Messages postés 7 Date d'inscription   Statut Membre Dernière intervention   > KX Messages postés 19031 Statut Modérateur
         
        Super, MERCI BEAUCOUP
        0