2013-02-22 7 views
0

J'essaie de comprendre comment accéder aux données au format JSON et suis parti une journée entière à chercher des moyens, mais je n'arrive toujours pas à trouver une solution répondant à mes besoins. La question relative la plus proche de mon problème est this question mais en vain.Comment accéder aux données au format JSON en utilisant javascript

Fondamentalement, je récupère des données de $.ajax() qui retourne au format JSON.

[{"v":"233","pv":"1.83","avd":"00:01:58","nv":"82.83%","br":"75.11%"}, 
{"v":"17","pv":"3.65","avd":"00:08:31","nv":"70.59%","br":"58.82%"}, 
{"v":"9","pv":"2.22","avd":"00:01:51","nv":"0.00%","br":"44.44%"}] 
[{"date":"2013-02-01","visits":63}, 
{"date":"2013-02-02","visits":30}] 

Mon problème est de savoir comment puis-je accéder aux éléments à l'intérieur du JSON, dire que je veux obtenir toutes les valeurs de « nv » ou toutes les valeurs de « date » sur la deuxième tranche, en javascript? Je suis nouveau à des choses comme celles-ci, donc je ne suis pas familier avec les terminologies, désolé pour cela.

Ci-dessous mon code:

var Data = $.ajax({ 
    url: url, 
    type: 'POST', 
    dataType:"json", 
    async: false 
}).responseText; 

console.log(Data); 

url est une variable qui est passée dans ma fonction au cas où vous pourriez demander.

+3

JSON représente un seul objet ou un tableau, de sorte que vous ne pouvez pas retourner deux tableaux entièrement séparés. Comment cela fonctionnerait-il lorsque vous l'analyseriez en un objet/tableau stocké dans une variable? Une variable ne peut pas pointer vers deux choses distinctes. –

+0

@AnthonyGrist a raison. Votre chaîne JSON n'est pas valide. Vérifiez-le dans http://jsonlint.com/ – Kris

+0

@Kris merci pour le lien, je suppose que je dois reconstruire ma chaîne json. – Darth

Répondre

4

Mise à jour: Voir le commentaire d'Anthony Grist sur votre question, j'ai raté le fait que votre JSON est invalide. Comme il n'a pas posté de réponse, je vais le ramasser.

Votre JSON est invalide parce que vous retournez deux tableaux distincts, celui-ci:

[{"v":"233","pv":"1.83","avd":"00:01:58","nv":"82.83%","br":"75.11%"}, 
{"v":"17","pv":"3.65","avd":"00:08:31","nv":"70.59%","br":"58.82%"}, 
{"v":"9","pv":"2.22","avd":"00:01:51","nv":"0.00%","br":"44.44%"}] 

et celui-ci:

[{"date":"2013-02-01","visits":63}, 
{"date":"2013-02-02","visits":30}] 

Vous ne pouvez pas faire cela, parce que le niveau supérieur un document JSON doit être un objet (un objet ou un tableau).

Vous pouvez retourner un objet avec des propriétés pour chaque tableau:

{ 
"vdata": 
    [{"v":"233","pv":"1.83","avd":"00:01:58","nv":"82.83%","br":"75.11%"}, 
    {"v":"17","pv":"3.65","avd":"00:08:31","nv":"70.59%","br":"58.82%"}, 
    {"v":"9","pv":"2.22","avd":"00:01:51","nv":"0.00%","br":"44.44%"} 
    ], 
"datedata": 
    [{"date":"2013-02-01","visits":63}, 
    {"date":"2013-02-02","visits":30} 
    ] 
} 

Après l'analyse syntaxique (voir ci-dessous), vous pouvez accéder à ces données comme ceci:

console.log(data.vdata[0].v); // "233" 
console.log(data.datedata[0].date); // "2013-02-01" 

Ou un tableau avec deux fentes , avec chaque slot dans lequel se trouve l'un de vos tableaux:

[ 
    [{"v":"233","pv":"1.83","avd":"00:01:58","nv":"82.83%","br":"75.11%"}, 
    {"v":"17","pv":"3.65","avd":"00:08:31","nv":"70.59%","br":"58.82%"}, 
    {"v":"9","pv":"2.22","avd":"00:01:51","nv":"0.00%","br":"44.44%"} 
    ], 
    [{"date":"2013-02-01","visits":63}, 
    {"date":"2013-02-02","visits":30} 
    ] 
] 

Après l'analyse (voir ci-dessous), vous pouvez accéder que les données comme ceci:

console.log(data[0][0].v); // "233" 
console.log(data[1][0].date); // "2013-02-01" 

Personnellement, je préfère utiliser un objet, car il est clair que je éventail accès.


réponse originale:

jQuery va analyser le JSON dans un objet pour vous et passer à la fonction que success, que vous pouvez alors accéder comme tout autre objet. Dans votre cas, le niveau supérieur est un tableau. Alors:

$.ajax({ 
    url: url, 
    type: 'POST', 
    dataType:"json", 
    async: false, 
    success: function(data) { 
     // Use the line from above that suits the way 
     // you updated your JSON structure 
    } 
}); 

Side note: async: false est dépréciée et sera retiré à un moment donné.Ce n'est généralement pas une bonne idée de faire des requêtes ajax synchrones, cela tend à bloquer l'interface utilisateur du navigateur lors de la requête. Au lieu de cela, il suffit de structurer votre code pour continuer le traitement lorsque le rappel success est déclenché.

+0

merci @Crowder pour répondre, mais pour une raison étrange, il n'y a pas de données affichées sur le journal. J'ai essayé de mettre en place une simple fonction 'alert()' sous le rappel 'successful' pour vérifier, mais même cela ne s'est pas déclenché. Des idées sur la façon de résoudre les problèmes? – Darth

+1

@Darth: J'ai pensé à partir de votre question que vous aviez réussi à voir le JSON revenir, mais on dirait que vous ne l'étiez pas. Cela suggère que vous faites un appel d'origine croisée et que vous êtes bloqué par la [Politique de même origine] (http://en.wikipedia.org/wiki/Same_origin_policy), qui interdit les appels d'origine croisée. Si l'autre extrémité le supporte, vous pouvez utiliser [JSONP] (http://en.wikipedia.org/wiki/JSONP#JSONP), qui contourne le SOP, ou (si, encore une fois, la source le supporte) [ CORS] (http://www.w3.org/TR/access-control/). Mais CORS nécessite également le support du navigateur. –

+0

@Crowder yep Je peux afficher le JSON retourné dans le journal avec 'console.log (Data)' qui est impair. – Darth

1

Si je comprends votre problème, vous devez accéder à la même clé pour tous les objets de cette matrice.

Il n'existe aucune méthode directe pour cela, vous devez parcourir tous les objets de ce tableau, puis trouver la clé souhaitée dans chacun de ces objets.

JSON.parse() convertit cette chaîne en JSON (JavaScript Object)

var myData = JSON.parse(Data); 

for(var i = 0; i < myData.length; i++) { 
    console.log("This is the nv value of the " + i + " object: " + myData[i].nv); 
} 
+0

Oui, c'est vrai, j'ai besoin d'accéder à la même clé pour tous les objets. mais après votre code m'a donné cette erreur: 'SyntaxError: JSON.parse: character' inattendu ' var = myData JSON.parse (données); ' – Darth

+0

@Darth:' '
est dans votre message d'erreur ou fait partie de l'erreur? Je pense que cela ne fait pas partie de l'erreur, alors peut-être que vous n'avez aucune donnée dans votre variable de données. Au lieu du rappel 'success', vous pouvez essayer le rappel' error' ou le rappel 'complete' pour savoir ce qui se passe ici. – mrleone

+0

'
' ne fait pas partie de mon message d'erreur, vient de gâcher mon commentaire il y a un moment. Merci pour le callback 'error' et' complete', va vérifier cela. – Darth

Questions connexes