2010-12-12 21 views
6

Estoy creando una aplicación ajax usando jQuery 1.4.2 y he intentado usar el uso de get(), post() y el método ajax(). Mis php devuelve el servicio:accediendo a los datos json de jquery

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

en mi devolución de llamada de éxito que he intentado acceder como json.status y JSON [0] [0] pero siempre vuelve "indefinido". ¿Qué estoy haciendo 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; 
} 

He estado buscando en Google esto por días. ¿Cómo diablos puedo acceder a los datos devueltos? Cualquier ayuda sería apreciada.

+0

le di alguna respuesta que se pueden utilizar en su caso, ya existen métodos availbe como getJSON que se encarga de todos los problemas, y puedes simplemente recorrer el – kobe

Respuesta

6

para acceder a ese valor de estado se necesitaría:

data[4].status 

Esto se debe a que es un objeto almacenado en el quinto elemento en una matriz, con status siendo una propiedad en el objeto.

+0

ahh - bueno, eso tiene un poco más de sentido ... Realmente no me importaba demasiado el elemento de estado. Necesitaba los pares k/v. Realmente solo estaba experimentando ... y estaba pensando que los datos [1] .v y los datos [1] [1] eran sinónimos. Gracias. – WWWIZARDS

5

En su éxito de devolución de llamada intento:

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

@lorezo, tenemos que recorrer todos los elementos ¿verdad? ¿Qué da .k y .v? – kobe

+0

@gov: ¡tienes razón! Me perdí la parte del bucle. Editado la respuesta para reflejar esto – Lorenzo

+0

No es necesario analizar el json de esta manera, jQuery ya lo habrá analizado. – andynormancx

4

No es necesario el eval("("+data+")");. jQuery es analizar automáticamente la respuesta JSON para usted porque ha especificado dataType:'json'

De la documentación de jQuery para tipoDatos:

"json": Evalúa la respuesta JSON y devuelve un objeto de JavaScript. En jQuery 1.4, los datos JSON se analizan de manera estricta; cualquier JSON malformado es rechazado y se produce un error de análisis. (Para más información sobre el formato JSON adecuada json.org Ver.)

+1

NO. MALO. 'JSON.parse()'. No use 'eval' para JSON. MALO. – mattbasta

+2

No defiendo el uso de eval. Simplemente digo que no lo necesita. Además, JSON.parse no es compatible con todos los navegadores (especialmente los más antiguos). Usar algo como $ .parseJSON que toma una decisión informada basada en el navegador es probablemente mejor. – nategood

+0

Estoy de acuerdo con la parte eval(), simplemente no estaba seguro de lo que estaba pasando debajo del capó. Algunas de las cosas que estaba buscando en Google eran de hace varios años. Me enteré de que jQuery 1.4 lo tiene incorporado así que solo lo necesitaría si mi flujo fuese type = 'text' ... pero tendré que buscar más en parseJSON(). – WWWIZARDS

2

hay necesidad de utilizar eval más abajo utilizar código que puede ser más para JSON

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

      }); 
     }); 
+0

Eso no es necesario, el código en la pregunta ya estará analizando al json perfectamente feliz. También $ .getJSON solo se puede usar para solicitudes GET que no sean POST, ya que la pregunta está siendo utilizada. – andynormancx

+0

Sí, necesito POST y ajax() también da más flexibilidad con las opciones. Gracias por la respuesta, sin embargo ... – WWWIZARDS

0

nategood ya escribió que usted don' No necesito hacer nada con los datos, ya es un objeto.

En este caso se trata de una matriz, si se quiere acceder a la situación, es necesario recuperarlo desde el último elemento de los datos de matriz (que es donde lo encontrará en esta matriz):

data[data.length-1].status 

Pero tal vez deberías pensar en otra estructura de tu JSON, no parece muy cómoda.

Algo así:

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

... debe ser más fácil de manejar, ya que simplemente puede acceder data.status primera vez de mirar por dónde se puede encontrar dentro de la respuesta (lo que puede ser de errores propenso).

+0

No me interesó mucho el estado, pero los pares k/v ... pensé que quizás era necesario que la respuesta desencadenara el análisis sintáctico. Intentaba ponerlo en algo similar a tu estructura, pero inadvertidamente lo hice y array_push ($ jsonData, array ("estado" => "OK")); - en el lado php. En cualquier caso, necesitaba la nomenclatura para acceder correctamente a la matriz ... – WWWIZARDS

+0

Agradezco su ayuda, sin embargo. – WWWIZARDS

7

Su JSON-datos se parece a esto:

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

Usted tendría que leer su estado mediante

json[4].status 

con el 4 como un número mágico o length-1 - no es deseable.Me plantearía modificar su respuesta servidores a algo más útil como esto:

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