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

JavaScript Discussion :

JSON : envoi de tableau de String vers le Javascript


Sujet :

JavaScript

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 40
    Points : 21
    Points
    21
    Par défaut JSON : envoi de tableau de String vers le Javascript
    Salut à tous,

    J'ai une question qui me fait rager depuis un petit moment.

    Je travaille sur une portlet.
    Lorsque l'utilisateur clique sur un bouton, je veux construire un arbre.
    Les données de cet arbre proviennent du .java.

    Ces données du .java sont dans un tableau de String. Ce tableau de String je souhaite le transmettre côté javascript.

    Pour l'instant je m'y prends ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    org.json.JSONObject data = null;
    try
    {
    	data = new org.json.JSONObject(dataForTree); // dataForTree est mon tableau de String
     
    }
    catch(Exception e)
    {
    	...
    }
    puis pour l'envoi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    try
    {
         PrintWriter writer = resourceResponse.getWriter();
         writer.print(data );
    }
    ...

    Du côté javascript je récupère ce résultat: {"class":"class [[[Ljava.lang.String;"}

    Ca me fait une belle jambe un resultat pareil.

    Comment puis-je m'y prendre pour exploiter mon tableau de String ?

    D'avance merci,
    Nicolas

  2. #2
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 640
    Points : 66 669
    Points
    66 669
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var monjsonexploitable= eval(+'('+retournstringjson+')')

  3. #3
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 40
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par SpaceFrog Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var monjsonexploitable= eval(+'('+retournstringjson+')')

    Pour toi monjsonexploitable c'est la variable qui contient {"class":"class [[[Ljava.lang.String;"} ?

    et à quoi correspond retournstringjson ?

    D'avance merci

  4. #4
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Citation Envoyé par Nicolas74100 Voir le message
    Pour toi monjsonexploitable c'est la variable qui contient {"class":"class [[[Ljava.lang.String;"} ?

    et à quoi correspond retournstringjson ?

    D'avance merci
    Non, c'est le contraire !

    monjsonexploitable est une variable qui contiendra l'objet JavaScript évalué à partir de la chaine retournstringjson qui correspond à ton {"class":"class [[[Ljava.lang.String;"}

  5. #5
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 40
    Points : 21
    Points
    21
    Par défaut
    Merci pour vos réponse.

    Je vais essayer cela.

    PS : une dernière question et non des moindres (je l'espère ) :
    On peut utiliser cet outil quelque soit le type de la donnée ? Ca peut être un arrayList aussi bien qu'un tableau de String à 3 dimensions ou un tableau de string à 1 dimension ?

  6. #6
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 640
    Points : 66 669
    Points
    66 669
    Billets dans le blog
    1
    Par défaut
    eval evaluera une chaine string quelle qu'elle soit ...
    pour peut qu'elle soit formatée de façon correcte et corresponde à du code javascript bien mis en form, eval retournera l'evaluation de l'expression string


    exemples:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    eval("alert('bonjour')")
     
    truc=eval('('+"{sayhello:'bonjour'}" +')')
    alert(truc.sayhello)

    attention :
    1) cas particulier d'une evaluation de string json avec '('+ ... +')'

    2) eval est a manier avec parcimonie .... "eval is evil"

  7. #7
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 40
    Points : 21
    Points
    21
    Par défaut
    Ok.

    Je suppose donc que dans mon cas ça ne pourra pas aller.
    Dans mon programme de test, ma variable dataForTree est remplie de la manière suivante pour l'instant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    dataForTree[0][0][0] = "business1";
    dataForTree[0][1][0] = "service1";
    dataForTree[0][2][0] = "service2";
    Ca ne peut donc pas fonctionner ?

  8. #8
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    utiliser le parser var donnees = JSON.parse(donnees_json);

    http://fr.wikipedia.org/wiki/JSON#.C3.89valuation

    mais ton problème est côté java il te faut généré un flux json est un print d'une classe ne produit pas un flux json

    pour ça il te faut un outil type
    http://jsontools.berlios.de/

    tu trouvera une liste de lib json en java sur
    http://www.json.org/
    Java:
    * org.json.
    * Json-lib.
    * JSON Tools.
    * json-simple.
    * Stringtree.
    * SOJO.
    * Restlet.
    * Jettison.
    * json-taglib.
    * FLEXJSON.
    * XStream.
    * JsonMarshaller.
    * Flexjson.
    * Jackson JSON Processor.
    * JON tools.
    * google-gson.
    * Argo.
    * Pivot.

    A+JYT

  9. #9
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 40
    Points : 21
    Points
    21
    Par défaut
    J'utilise org.json comme lib.

    Lorsque j'aurai parsé je pourrai récupérer côté javascript mes données donc ?

  10. #10
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    Oui

    mais il te faut d'abord en faire du JSON

    org.json.JSONObject est une classe java donc ce que tu as dans ton "data" est un objet ce n'est pas du json

    tu fait donc un print sur un objet et cela te produit une chaine std java qui te dis que tu as un objet de la classe "toto"

    il te faut produire le JSON avant de le donner à ton client

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    org.json.JSONObject dataObject = null;
    String dataJSON;
    try
    {
        dataObject = new org.json.JSONObject(dataForTree); // dataForTree est mon tableau de String
        dataJSON = dataObject.toString();
    }
    catch(Exception e)
    {
        ...
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    try
    {
         PrintWriter writer = resourceResponse.getWriter();
         writer.print(dataJSON );
    }
    ...
    puis coté javascript tu parse ton json et tu récupère tes données dans un objet javascript

    A+JYT

  11. #11
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 40
    Points : 21
    Points
    21
    Par défaut
    Je te remercie pour tous ces conseils.

    Lorsque tu me dis de Parser mon JSON côté Javascript, il faut que je le parse de quel type pour que je retrouve ma donnée de type String[][][] ?

    Nicolas

  12. #12
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    JSON.parser du navigateur ou à défaut si le navigateur ne l'impémente pas une fonction js trouvé sur le net ou dans un lib js va côté JS te reconstruire à l'identique ton objet de départs
    exemple en php mais c'est pareil en Java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $r=array(
      array("toto","titi"),
      array("test", "truc")
    );
    $json=json_encode($r);
    cela créé un tableau contenant deux tableaux contenant des string
    le json_encode vas mettre tout ça sous forme d'une chaine
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [["toto","titi"],["test","truc"]]
    cette chaine est transmise au navigateur là le js le parse
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var data = JSON.parse(response.text)
    on obtien donc un tableau javascript
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alert(data[1][1]+' '+data[2][1]);
    ta variable data est un tableau identique à celui que tu avait dans ton Java ou ton PHP

    A+JYT

  13. #13
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 40
    Points : 21
    Points
    21
    Par défaut
    Alors je me suis lancé dans l'aventure.

    J'ai commencé par télécharger une lib depuis http://jsontools.berlios.de/ pour Parser mon dataForTree (générer mon flux JSON).

    Pour cela, j'instancie un objet JSONParser. Je bloque déjà à ce niveau là. Le constructeur prend en paramètre un InputStream ou un Reader.
    Et j'ai pas trouvé comment transtyper mon dataForTree dans un de ces deux formats...

    Saurais tu comment procéder ?

  14. #14
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    à m connaissance jsontools de berlios c'est en java

    javascript normalement contient nativement l'objet JSON (sauf sur de vieux navigateur) si ton navigateur ne supporte pas cette methode
    tu trouvera en js un équivalent ici
    http://www.json.org/js.html

    mais avant ça côté java produit ton json teste ton java et copie le json qu'il à produit

    puis tu le colle sur http://json.parser.online.fr/ il va te faire le parsing et tu verra si ton json est correct et correspond à ce que tu attends.

    A+JYT

  15. #15
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 40
    Points : 21
    Points
    21
    Par défaut
    Ok. Le problème c'est que je n'arrive pas à trouver comment Parser mon String[][][] en flux json.

    La fonction pour le Parsing ne prend qu'une String ou un InputStream ou un Reader.
    Je suis donc bloqué à ce niveau là

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    jsonParser.parse(InputStream);
     
    // ou
     
    jsonParser.parse(Reader);
     
    // ou
     
    jsonParser.parse(String);
     
    // mais pas de
     
    jsonParser.parse(String[][][]);

  16. #16
    Inactif  

    Profil pro
    Inscrit en
    Mai 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 345
    Points : 496
    Points
    496
    Par défaut
    Citation Envoyé par Nicolas74100 Voir le message
    Ok. Le problème c'est que je n'arrive pas à trouver comment Parser mon String[][][] en flux json.

    La fonction pour le Parsing ne prend qu'une String ou un InputStream ou un Reader.
    Je suis donc bloqué à ce niveau là

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    jsonParser.parse(InputStream);
     
    // ou
     
    jsonParser.parse(Reader);
     
    // ou
     
    jsonParser.parse(String);
     
    // mais pas de
     
    jsonParser.parse(String[][][]);
    Si tu allais d'abord sur le forum Java pour ton problème et ensuite tu reviens ici.
    Car déjà j'ai l'impression que tu ne sais même pas ce que tu fais

  17. #17
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 40
    Points : 21
    Points
    21
    Par défaut
    Effectivement au début de ce Topic je ne savais pas trop où je mettais les pieds.
    Cependant grâce aux explications apportés par les membres, j'ai compris ce que je dois faire.
    Je ne comprends donc pas ta remarque.

  18. #18
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 640
    Points : 66 669
    Points
    66 669
    Billets dans le blog
    1
    Par défaut
    Comme dit plus haut eval n'evaluera que du code javascript
    il faut donc que java ecrive une chaine que js pourra interpréter ...
    La solution a ton problème se trouve coté java et non plus javascript .

  19. #19
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    côté java tu n'a pas à parser mais a encoder en json je t'ai corrigé ton bout de code pour produire un JSON avec org.json que tu as dit que tu utilisais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        dataObject = new org.json.JSONObject(dataForTree); // dataForTree est mon tableau de String
        dataJSON = dataObject.toString();
    la première chose à faire c'est de faire fonctionner ce bout de code qui doit te donner un chaine de caractère contenant quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [["toto","titi"],["test","truc"]]
    une fois que ton servelt java produit ce genre de chose tu peux le vérifier avec le parseur online que j'ai donné en référence

    lorsque côté java tout est OK
    en javascript il te suffit de donner cette chaine à JSON.parser() pour obtenir le résultat

    mais comme on n'a pas le code de ce que tu fais on ne sais pas comment tu créé ton JSON ni ce que tu mets dedans
    on ne sais pas comment tu mets ça dans ton serveur JSP ni ce que produit ton servelt.

    enfin on n'a pas non plus le code javascript de ta page HTML qui appelle l'Url de ton servelt on ne sais donc pas comment tu récupère ce que qu'il a produit donc on ne sais pas dans quelle variable tu as mis la réponse du servelt on ne peut donc pas dire comment tu peux le parser pour en faire un objet ou un tableau javascript

    je crois qu'avant de chercher à parser du json ou quoi que ce soit d'autre
    il faut que tu clarifie le processus global.

    en général l'enchainement est le suivant.
    Le client invoque une URL dans son navigateur
    Le serveur active une méthode du servelt associé à l'url
    la méthode produit une string contenant le source d'une page HTML
    Le servelt rend la main au serveur
    le serveur envoie la string (le html) au client
    le navigateur reçois la string
    il interprète le HTML qui est dedans
    Il crée la page et affiche les divers élément.
    sur un événement le navigateur active un code Javascript
    le code Javascript invoque l'objet XMLHttpRequest
    XMLHttpRequest invoque un URL
    le serveur active la méthode du servelt associée à l'URL demande
    la méthode fait son boulot et construit l'objet à retourner
    la méthode encode en JSON l'objet à retourner ce qui produit une string
    le servelt rend la main au serveur
    le serveur envoie la string (contenant le JSON) au client
    XMLHttpRequest reçois la chaine.
    Il vérifie que ce n'est pas du XML
    il active une méthode javascript et lui donne en paramètre l'objet reponse
    le javascript appelle JSON.parse(response.text) pour décoder le JSON contenu dans le texte de la réponse
    la méthode parse construit alors le ou les objet JavaScripts

    donc dans tout ce processus la partie JSON est minime si tout le reste n'est pas implémenté correctement tu peux toujours essayer n'importe quel code pour encoder ou decoder du JSON que ce soit côte client ou côté serveur il n'y a aucun raison que ça marche.

    ce processus n'est pas propre aux échanges JSON c'est le B-A-BA du web
    A+JYT

  20. #20
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 40
    Points : 21
    Points
    21
    Par défaut
    Merci pour ton aide et ta patience sekaijin.

    Je suis parvenu à encoder en JSON ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    myString = new org.json.JSONObject().put("dataForTree", dataForTree).toString();
    Je vérifie le résultat grâce au site http://json.parser.online.fr/ que tu m'as passé et il est valide.

    Côté Javascript je récupère mon dataForTree.
    Lorsque je fais un alert du résultat, je vois l'intégralité de mon tableau.

    Je Parse ensuite mon résultat ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    var data = JSON.parse(o.responseText);
    alert(data);
    alert(data) m'affiche cela : [object Object]

    Cependant le souci c'est lorsque j'effectue cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    alert(data[0][0][0]);
    Rien du tout ne s'affiche.

    Dois-je transtyper ma variable data ? car pour l'instant c'est un Object.

    Nicolas

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [vb6]Convertir de String vers tableau de char et inversement!
    Par sohaieb dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 13/05/2013, 17h38
  2. sscanf d'un string vers un tableau
    Par ____22 dans le forum C
    Réponses: 7
    Dernier message: 31/08/2009, 15h37
  3. Réponses: 18
    Dernier message: 14/11/2008, 17h31
  4. tableau de char vers string hexa
    Par andromeda dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 22/07/2007, 23h10
  5. Problème avec StingTokenizer vers tableau de String
    Par nicofromChina dans le forum Collection et Stream
    Réponses: 9
    Dernier message: 06/10/2006, 11h22

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