IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

JSON & Tableaux imbriqués


Sujet :

Android

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Janvier 2003
    Messages
    339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2003
    Messages : 339
    Points : 184
    Points
    184
    Par défaut JSON & Tableaux imbriqués
    Bonjour à tous

    Je galère à récupérer mes données issu de mon service web en PHP depuis uen Activity Android:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {"error":false,"data":{"1":{"nom":"Titi","prenom":"Toto","mail":"Tata","id":"1"},"2":{"nom":"addUser","prenom":"addUser","mail":"addUser","id":"2"},"3":{"nom":"addUser","prenom":"addUser","mail":"addUser","id":"3"},"4":{"nom":"addUser","prenom":"addUser","mail":"addUser","id":"4"},"5":{"nom":"addUser","prenom":"addUser","mail":"addUser","id":"5"},"6":{"nom":"addUser","prenom":"addUser","mail":"addUser","id":"6"},"7":{"nom":"addUser","prenom":"addUser","mail":"addUser","id":"7"},"8":{"nom":"addUser","prenom":"addUser","mail":"addUser","id":"8"},"9":{"nom":"addUser","prenom":"addUser","mail":"addUser","id":"9"},"10":{"nom":"addUser","prenom":"addUser","mail":"addUser","id":"10"},"11":{"nom":"addUser","prenom":"addUser","mail":"addUser","id":"11"},"12":{"nom":"addUser","prenom":"addUser","mail":"addUser","id":"12"},"13":{"nom":"addUser","prenom":"addUser","mail":"addUser","id":"13"},"14":{"nom":"addUser","prenom":"addUser","mail":"addUser","id":"14"},"15":{"nom":"addUser","prenom":"addUser","mail":"addUser","id":"15"},"16":{"nom":"addUser","prenom":"addUser","mail":"addUser","id":"16"}},"explain":"Enregistrements trouv?s","code":"TOTO_GETLIST_01_OK"}
    J'arrive bien à récupérer les données "error", "explain" et "code" mais pour ce qui est de "data", je ne vois pas comment faire. Je souhaite boucler sur les éléments pour les afficher dans une listview. Mon problème se situe dans "case "TOTO_GETLIST_01_OK":"

    Je ne sais pas si le JSON est sur un format idéal et/ou si je dois utiliser JSONObject ou JSONArray. Pouvez vous m'aider ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    try {
        JSONObject jObj = new JSONObject(response);
        Boolean isError  = valueOf(jObj.getString("error"));
        String explain = jObj.getString("explain");
        String Code_Ret = jObj.getString("code");
        if (isError) {
            Toast.makeText(getApplicationContext(), Code_Ret + " : " + explain , Toast.LENGTH_LONG).show();
        } else {
            switch (Code_Ret) {
                case "TOTO_GETLIST_01_OK":
                    JSONArray  data = jObj.getJSONArray("data");
                    for (int i = 0; i < data.length(); i++) {
    
                        JSONObject item = data.getJSONObject(i);
                        Integer id = item.getInt("id");
                        String nom = item.getString("nom");
                        String prenom = item.getString("prenom");
                        String mail = item.getString("mail");
                        Toto totoJSON = new Toto(id,nom,prenom,mail);
                                                       }
                    break;
                case "TOTO_GETLIST_02_EMPTY":
                    Toast.makeText(getApplicationContext(), explain, Toast.LENGTH_LONG).show();
                    break;
                default:
                    Toast.makeText(getApplicationContext(), Code_Ret + " : " + "Erreur du service inconnue", Toast.LENGTH_LONG).show();
                    break;
            }
        }
    } catch (JSONException e) {
        // JSON error
    e.printStackTrace();
        Toast.makeText(getApplicationContext(), "Json error: " + e.getMessage(), Toast.LENGTH_LONG).show();
    }
    « Ne me faites pas d'objections.
    Les difficultés en feront assez d'elles-mêmes. »

    sir Winston Churchill

  2. #2
    Membre averti
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2011
    Messages : 250
    Points : 403
    Points
    403
    Par défaut
    Ton objet "data" n'est pas un tableau,normal qu'un JSONArray ne fonctionne pas
    Si c'en était un il serait de la forme, et ce serait plus facile à gérer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    "data": [
          {
            "nom": "Titi",
            "prenom": "Toto",
            "mail": "Tata",
            "id": "1"
          },
         {
            "nom": "addUser",
            "prenom": "addUser",
            "mail": "addUser",
            "id": "2"
          }
    ]

  3. #3
    Membre habitué
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Janvier 2003
    Messages
    339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2003
    Messages : 339
    Points : 184
    Points
    184
    Par défaut
    Ha yes,JSON est encore obscure pour moi !

    Du coup, faut que je modifie mon serveur mais je ne vois pas comment car les champs n'ont pas tous le même type (INT et STRING). Dois je passer par une classe ? Si oui, comment cela se passe-t-il pour JSON ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
       public function getAllTotos()    {
            $query = "SELECT id,nom, prenom, mail FROM toto";
     
            if ($DB_result = $this->conn->query($query)) {
     
                if ($DB_result->num_rows > 0) {
                    // * Au moins un élément est retourné
                    $result["COD_RET"] = 1;
                    $result["explain"] = "Enregistrements trouvés";
                    while ($row = $DB_result->fetch_row()) {
                        $result["data"][$row[0]]["nom"] = $row[1];
                        $result["data"][$row[0]]["prenom"] = $row[2];
                        $result["data"][$row[0]]["mail"] = $row[3];
                        $result["data"][$row[0]]["id"] = $row[0];
                    }
                } else {
                    // * Aucun élément n'est retourné
                    $result["COD_RET"] = 2;
                    $result["explain"] = "Aucun enregistrement trouvé";
                    $result["data"] = "";
                }
            } else {
                // * Problème d'accès MYSQL
                $result["COD_RET"] = 99;
                $result["data"] = "";
                $result["explain"] = "La requête a SELECT envoyé une erreur";
            }
     
            $DB_result->close();
            return $result;
        }
    « Ne me faites pas d'objections.
    Les difficultés en feront assez d'elles-mêmes. »

    sir Winston Churchill

  4. #4
    Membre habitué
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Janvier 2003
    Messages
    339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2003
    Messages : 339
    Points : 184
    Points
    184
    Par défaut
    Bon en fait, en cherchant a fond (mal de crane !!)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    while ($row = $DB_result->fetch_row()) {                    
     
                        $toto = new Toto();
     
                        settype($row[0], "int");
     
                        $toto->setId($row[0]);
                        $toto->setNom($row[1]);
                        $toto->setPrenom($row[2]);
                        $toto->setMail($row[3]);
     
                        $data[] = $toto;
                    }
                    $result["data"] = $data;
    Cela me permet d'avoir le JSON attendu.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {"error":false,"data":[{"id":17,"nom":"eee","prenom":"eee","mail":"eee@gmail.com"},{"id":27,"nom":"eee","prenom":"eee","mail":"eee@eee.com"}],"explain":"Enregistrements trouv?s","code":"TOTO_GETLIST_01_OK"}
    Puis je l'ai adapté dans Android Studio

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    try {    JSONObject jObj = new JSONObject(response);
        Boolean isError  = valueOf(jObj.getString("error"));
        String explain = jObj.getString("explain");
        String Code_Ret = jObj.getString("code");
        if (isError) {
            Toast.makeText(getApplicationContext(), Code_Ret + " : " + explain , Toast.LENGTH_LONG).show();
        } else {
            switch (Code_Ret) {
                case "TOTO_GETLIST_01_OK":
                    JSONArray data = jObj.getJSONArray("data");
                    for (int i = 0; i < data.length(); i++) {
    
                        JSONObject c = data.getJSONObject(i);
                        Integer id = c.getInt("id");
                        String nom = c.getString("nom");
                        String prenom = c.getString("prenom");
                        String mail = c.getString("mail");
                        Toto totoJSON = new Toto(id,nom,prenom,mail);
    
                                                       }
    break;
    « Ne me faites pas d'objections.
    Les difficultés en feront assez d'elles-mêmes. »

    sir Winston Churchill

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. OnClick avec Tableaux imbriqués
    Par bondak dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 02/08/2007, 20h19
  2. Tableaux imbriqués et instances
    Par sayag dans le forum Windows Forms
    Réponses: 5
    Dernier message: 25/06/2007, 17h15
  3. [Tableaux] Deux tableaux imbriqués
    Par djedje37et28 dans le forum Langage
    Réponses: 4
    Dernier message: 23/03/2007, 19h57
  4. [Tableaux] Besoin d'explications sur les tableaux imbriqués
    Par gateaubasque dans le forum Langage
    Réponses: 5
    Dernier message: 23/03/2007, 09h12
  5. [HTML]problème de tableaux imbriqués
    Par tyrann dans le forum Balisage (X)HTML et validation W3C
    Réponses: 8
    Dernier message: 24/03/2006, 15h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo