2010-12-12 13 views
6

Sto creando un'app ajax utilizzando jQuery 1.4.2 e ho provato a utilizzare utilizzando get(), post() e il metodo ajax() stesso. Il mio servizio PHP restituisce:accesso a dati json da jquery

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

nel mio successo richiamata ho cercato accesso come json.status e JSON [0] [0] ma restituisce sempre "non definito". Che cosa sto facendo di sbagliato?

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; 
} 

Ho cercato su Google per giorni. Come diavolo accedo ai dati restituiti? Qualsiasi aiuto sarebbe apprezzato.

+0

ho dato qualche risposta che può essere utilizzato nel vostro caso, ci sono già i metodi availbe come getJSON che si prende cura di tutti i problemi, e si può solo passare attraverso – kobe

risposta

6

per accedere a tale valore di stato si avrebbe bisogno:

data[4].status 

Questo perché si tratta di un oggetto memorizzato nel quinto elemento in un array, con status come proprietà sull'oggetto.

+0

ahh - beh, questo ha un po 'più senso ... Non mi importava molto dell'elemento di stato. Avevo bisogno delle coppie k/v. Stavo solo sperimentando ... e stavo pensando che data [1] .v e data [1] [1] fossero sinonimi. thanx. – WWWIZARDS

5

nel vostro successo callback prova:

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

@lorezo, dobbiamo scorrere tutti gli elementi giusto ?? cosa dà .k e .v dà ?? – kobe

+0

@gov: hai ragione !! Ho perso la parte del ciclo. Modificata la risposta per rispecchiare questo – Lorenzo

+0

Non è necessario analizzare il json in questo modo, jQuery lo avrà già analizzato. – andynormancx

4

Non è necessario il eval("("+data+")");. jQuery è l'analisi automaticamente la risposta JSON per voi, perché è stato specificato dataType:'json'

Dalla documentazione jQuery per dataType:

"JSON": valuta la risposta come JSON e restituisce un oggetto JavaScript. In jQuery 1.4 i dati JSON vengono analizzati in modo rigoroso; qualsiasi JSON non valido viene rifiutato e viene generato un errore di analisi. (Vedere json.org per ulteriori informazioni sulla corretta formattazione JSON.)

+1

NO. CATTIVO. 'JSON.parse()'. Non usare 'eval' per JSON. CATTIVO. – mattbasta

+2

Non sto sostenendo l'utilizzo di eval. Sto semplicemente dicendo che non ne ha bisogno. Anche JSON.parse non è supportato da tutti i browser (specialmente quelli più vecchi). Usare qualcosa come $ .parseJSON che rende una decisione informata basata sul browser è probabilmente meglio. – nategood

+0

Sono d'accordo con la parte eval(), ma non ero sicuro di cosa stesse succedendo sotto il cofano. Alcune delle cose che stavo cercando su Google erano di diversi anni fa. Ho imparato che jQuery 1.4 lo ha integrato, quindi mi servirebbe solo se il mio stream fosse type = 'text' .. ma dovrò cercare più in parseJSON(). – WWWIZARDS

2

alcun bisogno di usare eval più utilizzare al di sotto di codice che può essere di più per JSON

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

      }); 
     }); 
+0

Non è necessario, il codice nella domanda sta già analizzando perfettamente la frase. Anche $ .getJSON può essere utilizzato solo per richieste GET non POST, come la domanda sta usando. – andynormancx

+0

sì, ho bisogno di POST & ajax() offre anche una maggiore flessibilità con le opzioni. Grazie per la risposta, anche se ... – WWWIZARDS

0

nategood già scritto che don' Non ho bisogno di fare nulla con i dati, è già un oggetto.

In questo caso si tratta di un array, se volete accedere allo stato, è necessario recuperarlo dal l'ultimo elemento del data-array (che è dove lo troverete in questo array):

data[data.length-1].status 

Ma forse dovresti pensare a un'altra struttura del tuo JSON, non sembra molto comodo.

Qualcosa del genere:

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

... dovrebbe essere più facile da gestire, perché si può semplicemente accedere data.status invece che prima guardare dove si possono trovare all'interno della risposta (quello che potrebbe essere degli errori prono).

+0

Non mi importava molto dello stato, ma le coppie k/v ... Pensavo che forse era necessario che la risposta attivasse l'analisi. Stavo cercando di farlo diventare qualcosa di simile alla tua struttura, ma inavvertitamente l'ho fatto e array_push ($ jsonData, array ("status" => 'OK')); - Dal lato php. In ogni caso, avevo bisogno della nomenclatura per accedere correttamente alla matrice ... – WWWIZARDS

+0

Apprezzo il tuo aiuto, però. – WWWIZARDS

7

tuo JSON-dati assomiglia a questo:

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

Si dovrebbe leggere il proprio stato utilizzando

json[4].status 

con la 4 come numero magico o length-1 - non è auspicabile.Vorrei prendere in considerazione modificando la risposta dei server per qualcosa di più utile in questo modo:

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