Parser un json à plusieurs noeuds

Résolu
polak1982 Messages postés 11 Date d'inscription   Statut Membre Dernière intervention   -  
polak1982 Messages postés 11 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

KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   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
polak1982 Messages postés 11 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
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020 > polak1982 Messages postés 11 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
polak1982 Messages postés 11 Date d'inscription   Statut Membre Dernière intervention   > KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention  
 
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
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020 > polak1982 Messages postés 11 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
polak1982 Messages postés 11 Date d'inscription   Statut Membre Dernière intervention   > KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention  
 
Super, MERCI BEAUCOUP
0