2009-10-22 23 views
5

EDITAR he comprobado la documentación de jQuery y el uso de $ .ajax con el tipo de datos JSON especificado devuelve un objeto evaluado Javascript, por lo eval() no es la respuesta aquí. Lo sabía de todos modos, ya que puedo analizar objetos JSON individuales, pero no arreglos. El problema es $ .each-ing mi camino a través de ellos :)Cómo analizar matriz JSON en jQuery?

He seguido la sintaxis para analizar una matriz JSON en jQuery a la letra, pero no funciona por alguna razón. Estoy buscando la matriz usando $ .ajax, he especificado el tipo de datos correcto, y en Firebug puedo ver que la respuesta de mi script PHP es []. Sin embargo, cuando trato de usar $ each para iterar a través de la matriz, lo único que consigue es valores indefinidos cuando intento console.log varias partes de la matriz. Aquí es donde mi script php hace y codifica la matriz:

if(mysqli_num_rows($new_res) > 0) { 
$messages = array(); 

while($message_data = mysqli_fetch_assoc($query_res)) { 
    $message = array(
    'poster' => $message_data['poster'], 
    'message' => $message_data['message'], 
    'time' => $message_data['time'] 
); 

    $messages[] = $message; 
} 

echo json_encode($messages); 
} else if(mysqli_num_rows($new_res) == 0) { 
$message = array(
    'poster' => '', 
    'message' => 'No messages!', 
    'time' => 1 
); 

echo json_encode($message); 
} 

Y aquí es mi intento de analizarlo:

var logged_in = '<?php echo $logged_in; ?>'; 
    var poster = '<?php echo $_SESSION["poster"];?>'; 
    $.ajax({ 
    url: 'do_chat.php5', 
    type: 'post', 
    data: ({'poster':poster,'logged_in':logged_in}), 
    dataType: 'json', 
    success: function(data) { 
     $.each(data, function(messageIndex, message) { 
        console.log(parseInt($('#chatWindow :last-child > span').html())+' '+message['time']); 
     if((parseInt(message['time']) > parseInt($('#chatWindow :last-child > span').html()))) { 
    $('#chatWindow').append('<div class="poster">'+message['poster']+'</div><div class="message"><span>'+message['time']+'</span>'+message['message']+'</div>'); 
     } 
     }); 
    } 
    }); 

Sin la función $ .Cada soy capaz de analizar correctamente los objetos individuales JSON , pero no una matriz. Esta es mi primera salida con JSON y $ each, y yo soy bastante nuevo en jQuery, por lo que ir fácil si mi código tiene los bits feos!

+0

¿Se las arregló para encontrar una solución? Si es así, sugiero que seleccione una respuesta: p –

+0

aún no lo hice, no. Edité pero no obtuve más respuestas. El problema yace en la forma en que PHP codifica el objeto JSON o con la sintaxis de $ .each. Yo consueloRegistramos los datos de respuesta, y luego eval() - ed it y consola lo registraron y recibo lo mismo, por lo que eval no fue la respuesta. – user97410

Respuesta

0

Su data es una cadena de '[{}]' en ese punto en el tiempo, puede eval que de este modo:

function(data) { 
    data = eval('(' + data + ')') 
} 

Sin embargo, este método está lejos de ser seguro, este será un poco más de trabajo, pero la mejor práctica es analizar con analizador JSON Crockford: https://github.com/douglascrockford/JSON-js

Otro método sería $.getJSON y necesitará para establecer el dataType a JSON de un método depende de jQuery puro.

+0

¿Esto no solo funciona si la matriz php jason_encodes es una matriz de un solo nivel? Por ejemplo, vea el código original que genera el objeto JSON. Solo en el caso de que la consulta de la base de datos no genere resultados, la matriz es unidimensional; de lo contrario, es multidimensional. – user97410

+0

oh No vi esa parte ... hm –

+0

Ok, igual debería estar evaluando, creo que ahora es una cadena en ese punto de su código. –

0

Usted puede utilizar la función eval() Javascript para analizar el JSON para usted. Ve the JSON website para una mejor explicación, pero usted debe ser capaz de cambiar la función de su éxito a ...

var returnedObjects = eval(data); 
var i = 0; 
for (i = 0; i < returnedObjects.length; i++){ 
    console.log('Time: ' + returnedObjects[i].time); 
} 

... o algo parecido.

+0

Creo que es efectivamente lo que se espera que haga $ .each, y pensé que usar $ .ajax con un tipo de datos json significaba que los datos de respuesta venían pre-evaluados. Lo intentaré sin embargo :) – user97410

13

No, con eval no es seguro, puede utilizar analizador JSON que es mucho más seguro: var myObject = JSON.parse(data); para este uso la lib https://github.com/douglascrockford/JSON-js

+1

Desde la página JSON: 'La función eval es muy rápida. Sin embargo, puede compilar y ejecutar cualquier programa JavaScript, por lo que puede haber problemas de seguridad' –

+0

Gracias. Corrijo mi texto – Cesar

0

puede descargar un analizador JSON desde un link on the JSON.org website la que funciona muy bien, también puede stringify que JSON para ver el contenido.

Además, si usted está utilizando EVAL y es una matriz JSON entonces usted tendrá que utilizar el siguiente synrax:

eval('([' + jsonData + '])');

-1

NO eval. use un analizador real, es decir, Desde json.org

5

Sé que esto es bastante tiempo después de su puesto, pero quería escribir para otras personas que podrían estar experimentando este problema y tropezar con este post como yo hizo.

Parece que hay algo sobre jquery's $.each que cambia la naturaleza de los elementos en la matriz.

que quería hacer lo siguiente:

$.getJSON('/ajax/get_messages.php', function(data) { 

    /* data: 

    [{"title":"Failure","details":"Unsuccessful. Please try again.","type":"error"}, 
    {"title":"Information Message","details":"A basic informational message - Please be aware","type":"info"}] 

    */ 

    console.log ("Data0Title: " + data[0].title); 
    // prints "Data0Title: Failure" 

    console.log ("Data0Type: " + data[0].type); 
    // prints "Data0Type: error" 

    console.log ("Data0Details: " + data[0].details); 
    // prints "Data0Details: Unsuccessful. Please try again" 


    /* Loop through data array and print messages to console */ 

}); 

Para lograr el bucle, lo primero intentado utilizar un jquery $.each a bucle a través de la matriz de datos. Sin embargo, como señala el OP, esto no funciona bien:

$.each(data, function(nextMsg) {  
    console.log (nextMsg.title + " (" + nextMsg.type + "): " + nextMsg.details); 
    // prints 
    // "undefined (undefined): undefined 
    // "undefined (undefined): undefined 
}); 

Esto no exactamente tiene sentido ya que soy capaz de acceder a los elementos de data[0] cuando se utiliza una tecla numérica en la matriz de datos. Así que ya que el uso de un índice numérico trabajado, he intentado (con éxito) la sustitución del bloque de $.each con un bucle for:

var i=0; 
for (i=0;i<data.length;i++){ 
    console.log (data[i].title + " (" + data[i].type + "): " + data[i].details); 
    // prints 
    // "Failure (error): Unsuccessful. Please try again" 
    // "Information Message (info): A basic informational message - Please be aware" 
} 

así que no sé el problema de fondo, una antigua usanza Javascript básica para el lazo parece ser una alternativa funcional para jQuery $.each

+0

+1 para el ciclo for. Me salvó algo de tipeo :) –

2

estoy tratando de analizar los datos JSON de regresar de una llamada AJAX, y la siguiente está trabajando para mí:

de código PHP

$portfolio_array= Array('desc'=>'This is test description1','item1'=>'1.jpg','item2'=>'2.jpg'); 

echo json_encode($portfolio_array); 

Y en los js, soy el análisis sintáctico de esta manera:

var req=$.post("json.php", { id: "" + id + ""}, 
function(data) { 
    data=$.parseJSON(data); 
    alert(data.desc); 
    $.each(data, function(i,item){ 
    alert(item); 
    }); 
}) 
.success(function(){}) 
.error(function(){alert('There was problem loading portfolio details.');}) 
.complete(function(){}); 

Si tiene una matriz multidimensional, como a continuación

$portfolio_array= Array('desc'=>'This is test description 1','items'=> array('item1'=>'1.jpg','item2'=>'2.jpg')); 
echo json_encode($portfolio_array); 

A continuación, el código de abajo debería funcionar:

var req=$.post("json.php", { id: "" + id + 
    function(data) { 
    data=$.parseJSON(data); 
    alert(data.desc); 
    $.each(data.items, function(i,item){ 
    alert(item); 
    }); 
}) 
.success(function(){}) 
.error(function(){alert('There was problem loading portfolio details.');}) 
.complete(function(){}); 

Tenga en cuenta que la clave de matriz secundaria aquí es elementos, y suponga que si tiene xyz, en lugar de data.items use data.xyz

2

El uso de .NET 3.5 FIX

Todos ustedes son un poco mal, pero la combinación de todos sus esfuerzos han dado sus frutos!

En lugar de eval ('([' + jsonData + '])'); No

success: function(msg){ 
var data = eval(msg.d); 
var i=0; 
for(i=0;i<data.length;i++){ 
    data[i].parametername /// do whatever you want here. 
}; 

No sé nada sobre el conjunto "no usar eval", pero lo que sí sé es que al hacer el '([' + msg + '])' que están anidando los objetos más profundos, en lugar de subir un nivel.