2010-12-12 32 views
6

Je crée une application ajax en utilisant jQuery 1.4.2 et j'ai essayé d'utiliser get(), post() et la méthode ajax() elle-même. Mon php service retourne:accéder aux données json à partir de jquery

[{"k":"label0","v":0.5},{"k":"label1","v":99.43},{"k":"label2","v":2.46},{"k":"label3","v":46.29},{"status":"OK"}] 

dans mon rappel de succès que j'ai essayé d'accéder à de json.status et JSON [0] [0] mais il retourne toujours "non défini". Qu'est-ce que je fais mal?

function getSysinfo(source) { 
    var json = null; 
    $.ajax({ 
     url: source, 
     type: 'POST', 
     dataType: 'json', 
     success: function (data) { 
      json = eval("(" + data + ")"); 
      $('#data').html(json.status); 
      alert(json[0][0]); 
      refreshChart(json); 
     }, 
     error: function (request, status, error) { 
      alert("REQUEST:\t" + request + "\nSTATUS:\t" + status + 
        "\nERROR:\t" + error); 
     } 
    }); 
    return json; 
} 

Cela fait des jours que je fais des recherches sur Google. Comment diable puis-je accéder aux données renvoyées? Toute aide serait appréciée.

+0

je lui ai donné une réponse qui peut être utilisé dans votre cas, il existe déjà des méthodes availbe comme getJSON qui prend en charge toutes les questions, et vous pouvez simplement faire une boucle à travers – kobe

Répondre

6

Pour accéder à cette valeur d'état vous avez besoin:

data[4].status 

C'est parce qu'il est un objet stocké dans le cinquième élément dans un tableau, status étant une propriété sur l'objet.

+0

ahh - eh bien ça fait un peu plus de sens ... Je ne m'intéressais pas vraiment à l'élément status. J'avais besoin des paires k/v. J'étais vraiment en train d'expérimenter ... et je pensais que les données [1] .v et les données [1] [1] étaient synonymes. merci. – WWWIZARDS

5

Dans votre essai de rappel de succès:

var parsed = $.parseJSON(data); 
$.each(parsed, function (i, jsondata) { 
    alert(jsondata.k); 
    alert(jsondata.v); 
}); 
+0

@lorezo, nous devons faire une boucle à travers tous les éléments droite ?? qu'est-ce que .k et .v donne ?? – kobe

+0

@gov: tu as raison !! J'ai raté la partie en boucle. Edité la réponse pour refléter cela – Lorenzo

+0

Vous n'avez pas besoin d'analyser le json comme ça, jQuery l'aura déjà analysé. – andynormancx

4

Vous n'avez pas besoin eval("("+data+")");. jQuery est l'analyse automatiquement la réponse JSON pour vous parce que vous avez spécifié dataType:'json'

De la documentation jQuery pour dataType:

« JSON »: Évalue la réponse JSON et retourne un objet JavaScript. Dans jQuery 1.4, les données JSON sont analysées de manière stricte; Tout fichier JSON mal formé est rejeté et une erreur d'analyse est générée. (Voir json.org pour plus d'informations sur la mise en forme correcte JSON.)

+1

NO. MAL. 'JSON.parse()'. N'utilisez pas eval pour JSON. MAL. – mattbasta

+2

Je ne préconise pas d'utiliser eval. Je dis simplement qu'il n'en a pas besoin. JSON.parse n'est pas non plus supporté par tous les navigateurs (en particulier les plus anciens). Utiliser quelque chose comme $ .parseJSON qui rend une décision éclairée basée sur le navigateur est probablement mieux. – nategood

+0

Je suis d'accord avec la partie eval() Je ne savais pas trop ce qui se passait sous le capot. Certaines choses que je recherchais sur Google dataient de plusieurs années. J'ai appris que jQuery 1.4 l'a intégré donc je n'en aurais besoin que si mon flux était type = 'text' .. mais je ferais mieux de regarder parseJSON(). – WWWIZARDS

2

pas nécessaire d'utiliser eval plus utiliser le code ci-dessous qui peut être plus pour JSON

$.getJSON(url+query,function(json){ 
      $.each(json,function(i,value){ 

      }); 
     }); 
+0

Ce n'est pas nécessaire, le code dans la question sera déjà en train d'analyser parfaitement le json. De plus, $ .getJSON ne peut être utilisé que pour les requêtes GET non POST, comme l'utilise la question. – andynormancx

+0

ouais j'ai besoin de POST & ajax() donne aussi plus de flexibilité avec les options. Merci pour la réponse, cependant ... – WWWIZARDS

0

nategood déjà écrit que vous n » Il faut faire quelque chose avec des données, c'est déjà un objet.

Dans ce cas, il est un tableau, si vous souhaitez accéder au statut, vous devez le récupérer à partir du dernier élément de la matrice de données (c'est où vous le trouverez dans ce tableau):

data[data.length-1].status 

Mais peut-être que vous devriez penser à une autre structure de votre JSON, il ne semble pas très à l'aise.

Quelque chose comme ça:

{ 
"items":[ 
     {"k":"label0","v":0.5}, 
     {"k":"label1","v":99.43}, 
     {"k":"label2","v":2.46}, 
     {"k":"label3","v":46.29} 
     ], 
"status":"OK" 
} 

... devrait être plus facile à manipuler, car vous pouvez simplement accéder data.status au lieu de regarder d'abord où vous pouvez le trouver dans la réponse (ce qui peut être ERROR- enclin).

+0

Je m'en foutais beaucoup de l'état, mais les paires k/v ... Je pensais que c'était peut-être nécessaire pour que la réponse déclenche l'analyse. J'essayais de l'obtenir dans quelque chose de similaire à votre structure mais par inadvertance et array_push ($ jsonData, array ("status" => 'OK')); - Du côté php. En tout cas, j'avais besoin de la nomenclature pour accéder au tableau correctement ... – WWWIZARDS

+0

J'apprécie cependant votre aide. – WWWIZARDS

7

Votre JSON données ressemble à ceci:

[ 
    { 
     "k": "label0", 
     "v": 0.5 
    }, 
    { 
     "k": "label1", 
     "v": 99.43 
    }, 
    { 
     "k": "label2", 
     "v": 2.46 
    }, 
    { 
     "k": "label3", 
     "v": 46.29 
    }, 
    { 
     "status": "OK" 
    } 
] 

Vous devrez lire votre statut en utilisant

json[4].status 

avec le 4 comme un nombre magique ou length-1 - pas souhaitable.Je considère modifier vos serveurs réponse à quelque chose de plus utile comme ceci:

{ 
    "status": "OK", 
    "entries": [ ... ] // add your data here 
}