2009-09-27 1 views
-1

Je fais un appel jquery .ajax et j'attends un résultat json. La capture est, s'il y a 5 auteurs, je vais obtenir author_details_0, author_details_1, author_details_2, etc .... Comment puis-je construire dynamiquement le nom de la variable à récupérer à partir de json? Je ne sais pas combien d'auteurs j'aurai, il pourrait y en avoir des centaines.Génération de nom de variable dynamique Jquery Json

$.ajax({ 
type: "POST", 
url: "/authordetails/show_my_details/", 
data: af_pTempString, 
dataType: "json", 
beforeSend: function() { 
}, 
success: function(jsonData) { 
    console.log("Incoming from backend : " + jsonData.toSource()); 
    if(jsonData.AuthorCount) 
    { 
     console.log("Number of Authors : " + jsonData.AuthorCount); 
     for (i = 0; i < jsonData.AuthorCount; i++) 
     { 
      temp = 'author_details_' + i; <-------------------This is the name of the variable I'm expecting. 
      console.log("Farm information : " + eval(jsonData.temp)); <----- This doesn't work, how can I get jsonData.author_details_2 for example, 'coz I don't know how many authors are there, there could be hundreds. 
     } 
    } 

S'il vous plaît laissez-moi savoir si vous avez une idée comment résoudre ce problème! Très apprécié.

+0

pourquoi avez-vous besoin author_details_0, 1, 2, etc? – yoda

+0

Comment générez-vous le json? – Eric

+0

J'utilise dJango au backend. Le modèle de données que j'ai créé contient la table Author & related Author_Details. Étant donné un identifiant d'éditeur, j'interroge et j'obtiens l'ensemble d'auteurs que je simplifie simplement: json_serializer.serialize (allAuthors, ensure_ascii = False). Cela ne sérialise pas les détails de l'auteur, donc je dois faire une boucle par l'auteur tableau d'objets et de les créer manuellement, donc author_details_XX où XX est la clé primaire de l'auteur. Je ne suis pas sûr s'il existe un moyen de regrouper un auteur et d'autres détails qu'il a comme un seul objet JSON Array. S'il y a, je serais heureux de moderniser mon code, car il est plus propre. – PlanetUnknown

Répondre

5

Vous pouvez accéder aux propriétés de l'objet de deux façons. La première est la notation par points, comme dans object.property. Vous pouvez également utiliser la notation de parenthèse, comme dans l'objet ['property']. Pas besoin de eval ici:

var propName = 'author_details_' + i; 
alert('Details for author ' + i + ' = ' + jsonData[propName]; 

This page adresses de votre prise en charge au fond.

+0

Ça marche aussi! Merci Barnabas, j'ai appris quelque chose ici! – PlanetUnknown

2

Résolu!

Au lieu d'utiliser "temp" - temp = 'author_details_' + i; puis faire - eval (jsonData.temp)

Tout cela fonctionne - eval ("jsonData.author_details_" + i)

Comme les données de la base de données, il est sûr, puisque je mets tout dans la base de données après vérification. Par conséquent, eval ne représentera pas une menace pour la sécurité.

Si vous avez d'autres solutions, je serais heureux de les entendre!

0

pourquoi ne pas stocker le JSON comme un tableau? au lieu de:

{ 
    "author_details_1": 
    { 
     ... 
    }, 
    "author_details_2": 
    { 
     ... 
    }, 
    "author_details_3": 
    { 
     ... 
    }, 
    "author_details_4": 
    { 
     ... 
    } 
    ... 
} 

essayer

{ 
    "author_details": 
    [ 
     { 
      ... 
     }, 
     { 
      ... 
     }, 
     { 
      ... 
     }, 
     { 
      ... 
     } 
    ] 
    ... 
} 

Ensuite, vous pouvez y accéder avec author_details [i].

+0

Merci Eric. Laissez-moi essayer cela aussi. – PlanetUnknown

0

Got le problème avec jQuery et la fonction .ajax $. Résolu en définissant l'objet 'données' en dehors de la fonction $ .ajax:

var data = new Object(); 
data.ContentNodeID = button.siblings('.ContentNodeID').val(); 
data.ContentObjectID = button.siblings('.ContentObjectID').val(); 
data.ActionAddToBasket = ''; 
data['eZOption['+$('[name=printFormatAttributeId]').val()+'][]'] = $('.eZOption').val(); 

$.ajax({ 
    cache: false, 
    type: 'POST', 
    url: button.parent().attr('action'), 
    data: data, 
    success: function(data){ 
       button.siblings('.addtobasket_success').css('display', 'inline'); 
       $('#shop_button').removeClass('disabled'); 
       $('#shop_button').removeAttr('disabled'); 
      }, 
    error: function(data) { 
       button.siblings('.addtobasket_failure').css('display', 'inline'); 
      } 
}); 
0
url = './json/demo_'+var+'.net'; 
$.getJSON(url, function(result){ 
    alert(result[0].name); 
}); 

OU

$.getJSON('./json/demo_'+var+'.net', function(result){ 
    alert(result[0].name); 
});