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.parse et guillemets


Sujet :

JavaScript

  1. #1
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut JSON.parse et guillemets
    Bonsoir à Tous,

    Côté PHP :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $data[] = array('text'=>$text,'value'=>"toto");
    echo json_encode($data);
    Côté JS, avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    var tab = JSON.stringify(obj);
    var tabok = JSON.parse(tab);
    J'obtiens dans la console

    [{"text":"Principale","value":"toto"},{"text":"Seconde","value":"toto"}]

    Mais pour les besoins de mon script je voudrais obtenir :

    [{text:"Principale",value:"toto"},{text:"Seconde",value:"toto"}]

    Donc que les clés n'aient pas de guillemets.
    Comment faire ?

  2. #2
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    Au format JSON, les clés auront toujours des guillemets. Une fois parsé en JavaScript, elles n'en auront jamais. Donc aucune inquiétude à avoir.
    One Web to rule them all

  3. #3
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut
    Au format JSON, les clés auront toujours des guillemets. Une fois parsé en JavaScript, elles n'en auront jamais. Donc aucune inquiétude à avoir.
    Ce qui revient à dire ?

  4. #4
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut
    Il faut pas utiliser json_encode côté php ?
    Il faut présenter le tableau php autrement ?
    Il faut le récupérer en js avec json.stringify ou parse ou les deux ou pas ?
    Je dois avoir ce format des clés sans quotes pour ajouter une liste à tinyMce.
    Et je sais pas trop vers quoi chercher.

  5. #5
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut
    Citation Envoyé par renaud26 Voir le message
    [...] Donc que les clés n'aient pas de guillemets. [...]
    Citation Envoyé par SylvainPV Voir le message
    [...] Une fois parsé en JavaScript, elles n'en auront jamais. [...]
    Je dirais plutôt qu'elles peuvent ne pas en avoir lorsque la clé est formée par un seul mot.

    Personnellement, je suis partisan d'en mettre systématiquement puisque c'est du texte. Je n'ai jamais rencontré un problème à cause des guillemets.

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  6. #6
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    Le seul moyen d'avoir des clés d'objet JS entourées de guillemets est d'utiliser un autre type de guillemet, simple ou backtick: o = { '"test"': 42 }
    Il faut vraiment vouloir le faire exprès, surtout si ça vient d'un JSON (où le double guillemet est obligatoire pour les clés). Mais oui, ne jamais dire jamais, surtout en PHP

    Tu es sûr que ces guillemets sont bien présents dans les clés elles-mêmes ? Ne te laisse pas abuser par le debugger, dans ton exemple les objets sont strictement équivalents.
    One Web to rule them all

  7. #7
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut
    Bonjour à Tous,

    Après avoir tourné le problème en tous les sens, le problème n'est peut-être pas dû aux guillemets...
    Mon but est d'alimenter une listBox dans tinyMce. J'ai crée une petite fonction qui est censée récupérer et retourner la chaine attendue par tiny.

    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
     
    			function afficheListe(){
    				var tab = "";
    				$.ajax({
    				   type:"POST",
    				   async: false,
    				   url:  $url,
    				   data: "id=$id",
    				   success: function(msg){
    					 if(msg){
     
    						tab = JSON.parse(JSON.stringify(msg));
     
     
    					 }
    				   }
     
    				 });
    			return tab;
    			}
    Le log de cette fonction affiche : [{"text ":"Principale"," value ":"toto"},{"text ":"seconde"," value ":"tata"}]

    Ensuite dans le setup de tiny :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    							setup:function (editor) {
    								editor.addButton('listeSignatures', {
    								  type: 'listbox',
    								  text: 'Vos signatures',
    								  icon: false,
    								  onselect: function (e) {
    									editor.insertContent(this.value());
    								  },
    								  values: afficheListe(), ////ICI JEVOUDRAIS BIEN LA CHAINE DE MON AJAX
     
    								});
    							  },
    Sauf que lorsque je clique sur la liste de l'éditeur pour voir si les options sont bien là, j'obtiens :
    Uncaught Error: Could not find control by type: [{"text ":"principale"," value ":"toto"},{"text ":"seconde"," value ":"tata"}]

    Et si je mets directement values: [{ "text":"principale","value":"toto" },{ "text":"seconde","value":"tata" }], à la place de la fonction
    Ca fonctionne !
    La seule différence réside dans l'espace entre { et "text".
    Mais il faut dire que c'est interprété dans un template smarty où les { } sont des balises...

  8. #8
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut
    Citation Envoyé par renaud26 Voir le message
    Le log de cette fonction affiche : [{"text ":"Principale"," value ":"toto"},{"text ":"seconde"," value ":"tata"}
    Il y a un problème à la génération du JSON, des espaces inutiles dans les clés !

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  9. #9
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut
    Non, j'ai du me gourer en saisissant le post mais dans la console:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [{"text":"Principale","value":"toto"},{"text":"Seconde","value":"tata"}]
    et si je saisis ça en "dur" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    values: [{ "text":"principale","value":"toto" },{ "text":"seconde","value":"tata" }],
    Ca le fait bien.

    Il faudrait au contraire que j'arrive à générer un espace entre { et "test" ainsi qu'en fin de chaine : "tata" }

  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
    JSON est un moyen de transport.
    peut importe comment il code l'information.
    Si tu utilise JSON.stringify JSON.Parse json_encode json_decode ces outils te garantissent que ce que tu encode sera décodé à l'identique.

    il pourrait transporter en binaire avec des caractères ésotérique ou avec n'importe quoi d'autre la seul chose qui importe c'est que la structure que tu encode sera celle que tu obtiendra au décodage
    que json_encode ajoute ou pas des " des espaces ou quoi que ce soit d'autre n'a aucun importance

    si tu met toto dans ta clef tu auras toto dans ta clef et que pour le transport JSON ait ou pas ajouté de " ne change rien. si tu a une map JSON va l'encoder {"clef":"valeur"} et qu'il y ait 1 2 20 ou googol espaces entre { " ne changera rien tu aura à l'arrivé un map identique.

    il ne sert absolument à vouloir modifier la façon don JSON encode les objets.

    mais surtout il est complètement absurde d'encoder 2 fois un objet pour le décoder 1 fois
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $data[] = array('text'=>$text,'value'=>"toto");
    echo json_encode($data);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tab = JSON.parse(JSON.stringify(msg));
    voici ce que tu fais
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $data[] = array('text'=>$text,'value'=>"toto");
    echo json_encode($data);// premier encodage
    =>
    Code text : Sélectionner tout - Visualiser dans une fenêtre à part
    [{"text":"Principale","value":"toto"},{"text":"Seconde","value":"tata"}]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    JSON.stringify(msg)
    //deuxième encodage
    où msg est la string précédente =>
    Code text : Sélectionner tout - Visualiser dans une fenêtre à part
    "[{\"text\":\"Principale\",\"value\":\"toto\"},{\"text\":\"Seconde\",\"value\":\"tata\"}]"
    ce qui est la représentation JSON de ta chaine de caractères.
    puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tab = JSON.parse(...);//premier decodage
    =>
    Code text : Sélectionner tout - Visualiser dans une fenêtre à part
    [{"text":"Principale","value":"toto"},{"text":"Seconde","value":"tata"}]

    tu obtiens une chaine est non pas la structure de donnée de départ
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    values: afficheListe(), ////ICI JE VOUDRAIS BIEN LA CHAINE DE MON AJAX
    ceci n'a absolument aucun sens ici ce dont tu as besoin c'est la structure de donnée et non la string
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $data[] = array('text'=>$text,'value'=>"toto");
    echo json_encode($data);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    values: afficheListe(), ////ICI le tableau de données
    //=>
    [
      {
        text:"Principale",
        value:"toto"
      },
      {
        text:"Seconde",
        value:"tata"
      }
    ]

    pour finir je dirais que data: "id=$id", est des plus étrange je ne vois pas ce qu'il fait là. ça sent très mauvais le mélange de js et php.
    A+JYT

  11. #11
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 957
    Points : 44 119
    Points
    44 119
    Par défaut
    Bonjour,
    ton return tab est en dehors de la fonction succes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    var tab = '';
    $.ajax({
        type: 'POST',
        async: false,
        url: $url,
        data: 'id=$id',
        success: function (msg) {
            if (msg) {
                tab = JSON.parse(JSON.stringify(msg));
            }
        }
    });
    return tab;
    de plus pourquoi ne pas utiliser le dataType:"json" ?

  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
    Il fait un appel synchrone

  13. #13
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 957
    Points : 44 119
    Points
    44 119
    Par défaut
    ah ! oui flûte, crotte, kk !

    par contre il faut récupérer tab[0], ou boucler sur le tableau.

  14. #14
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut
    Merci à vous, merci à toi sekaijin pour tes lumineuses explications.
    Effectivement je m'embrouillais grave avec json_encode, JSON.parse et stringify.
    Note pour data: "id=$id", c'est du arrangé pour ce post. En réalité les datas passés à php sont :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    data: "id_employee={$current_employee->id}",
    Et donc voici la fonction js qui va bien, grâce à vous :

    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
     
    			function afficheListe(){
    				var tab = "";
    				$.ajax({
    				   type:"POST",
    				   async: false,
     
    				   url:  "json.php",
    				   data: "id_employee={$current_employee->id}",
    				   datatype: "json",
    				   success: function(mydata){
     
    						tab = JSON.parse(mydata);
     
    				   }
     
     
    				 });
    			return tab;
    			}
    Ensuite le values : afficheListe() affiche bien les options récupérées.
    Encore merci et bon week-end !

  15. #15
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 957
    Points : 44 119
    Points
    44 119
    Par défaut
    Attention, pas datatype: "json" mais dataType: "json" ce qui t'évites le JSON.parse(mydata).

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 06/05/2012, 17h41
  2. Tri par clé lors d'un JSON.parse
    Par legentil dans le forum jQuery
    Réponses: 4
    Dernier message: 11/02/2012, 20h56
  3. JSON Parsing en JSONArray sur android
    Par S.Jihad dans le forum Android
    Réponses: 7
    Dernier message: 08/05/2011, 13h49
  4. Jersey Json parse
    Par allouli_raf dans le forum Format d'échange (XML, JSON...)
    Réponses: 0
    Dernier message: 20/04/2011, 15h32
  5. JSON parse et stringify
    Par sekaijin dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 05/11/2009, 15h36

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