2009-09-13 12 views
0

Je suis probablement manquer quelque chose avec json et javascript.résultat JSON contenant un seul article

[{"commentText":"Testing 123","userPosted":"maxfridbe"}, 
{"commentText":"Testing 23","userPosted":"maxfridbe"}] 

Parfois, je reçois plusieurs réponses qui fonctionne avec ce code:

function(data) 
     { 
      var sel = this; 

      jQuery.each(data, 
       function() 
       { 
        sel.append("<li>"+ this.userPosted+ "-" + this.commentText + "</li>"); 
       });   
     }; 

Parfois, je reçois une seule réponse qui casse le code ci-dessus:

[{"commentText":"another test again welcom","userPosted":"maxfridbe"}] 

Je sais que c'est parce que le la réponse est traitée différemment d'une liste.

En cherchant la réponse à cette question, je suis un peu en retard. Toute solution serait grandement appréciée.

Répondre

0

Jouer avec la solution de CMS m'a fait réaliser que les données était une grande chaîne de caractères si:

if (!jQuery.isArray(data)) data = eval(data); 

travaillé car alors les données ont été un objet. Je ne sais pas pourquoi, quand il y a plusieurs résultats, il fait une évaluation pour vous.

+0

Si vos données sont juste une chaîne, vous devez utiliser l'option dataType: 'json' dans votre requête ajax, ou utiliser la fonction getJSON – CMS

7

Dans le deuxième exemple que vous fournissez, il semble être un tableau avec un seul élément, si elle est comme ça, ça devrait fonctionner, mais je pense que vous obtenez un seul objet comme:

{"commentText":"another test again welcom","userPosted":"maxfridbe"} 

S'il s'agit d'un seul objet, $.each effectue une itération sur les propriétés de l'objet.

Vous pouvez vérifier si votre variable data est pas un tableau en utilisant $.isArray, et si n'est pas, vous pouvez l'envelopper dans un seul ensemble d'éléments, de sorte que la fonction $.each continuera à fonctionner comme prévu:

//.. 
if (!jQuery.isArray(data)) data = [data]; // if isn't an array, wrap it 

jQuery.each(data, function() { 
    sel.append("<li>"+ this.userPosted+ "-" + this.commentText + "</li>"); 
}); 
//.. 
+0

Cela me semble juste. Maxfriebe devrait sortir le firebug et regarder ses données avec beaucoup d'attention. – timdev

+0

Ces données provenaient de firebug. – maxfridbe

+0

Super réponse! J'ai eu le même problème que l'OP et cela a fonctionné comme un charme. Je n'avais aucune idée que 'each()' itérerait à travers les propriétés d'un objet si seulement un seul objet était présenté pour itérer. – webworm

1

Je pense que vous devriez utilisateur certains paramètres facultatifs dans votre each() fonction:

function(data) 
    { 
     var sel = this; 

     jQuery.each(data, 
      function(i, item) 
      { 
       sel.append("<li>"+ item.userPosted+ "-" + item.commentText + "</li>"); 
      });   
    }; 

en utilisant ce mot-clé crée la confusion dans votre cas

Hope this helps

Questions connexes