Parser un json à plusieurs noeuds

Résolu/Fermé
polak1982 Messages postés 11 Date d'inscription dimanche 24 novembre 2013 Statut Membre Dernière intervention 6 septembre 2021 - Modifié le 5 sept. 2021 à 22:06
polak1982 Messages postés 11 Date d'inscription dimanche 24 novembre 2013 Statut Membre Dernière intervention 6 septembre 2021 - 6 sept. 2021 à 09:32
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 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
5 sept. 2021 à 17:46
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 dimanche 24 novembre 2013 Statut Membre Dernière intervention 6 septembre 2021
Modifié le 5 sept. 2021 à 21:56
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 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015 > polak1982 Messages postés 11 Date d'inscription dimanche 24 novembre 2013 Statut Membre Dernière intervention 6 septembre 2021
Modifié le 5 sept. 2021 à 22:48
"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 dimanche 24 novembre 2013 Statut Membre Dernière intervention 6 septembre 2021 > KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024
6 sept. 2021 à 00:25
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 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015 > polak1982 Messages postés 11 Date d'inscription dimanche 24 novembre 2013 Statut Membre Dernière intervention 6 septembre 2021
6 sept. 2021 à 07:51
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 dimanche 24 novembre 2013 Statut Membre Dernière intervention 6 septembre 2021 > KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024
6 sept. 2021 à 09:32
Super, MERCI BEAUCOUP
0