Imprimiendo array JSON devuelto
Tengo el siguiente array JSON:
[{"occurences":"1","post_title":"Test 1","ID":"16"},
{"occurences":"1","post_title":"Test 2","ID":"19"},
{"occurences":"1","post_title":"\u543b\u60a8\u7684\u5c41\u80a1","ID":"21"}]
Y uso este JavaScript para analizarlo e imprimirlo:
success:function(data){
$.each(data, function(i, post){
content = '';
content += '<li>' + post.post_title + '</li>';
});
$(content).appendTo("#search-results");
}
Pero la pantalla solo muestra "Undefined", y la Consola no mostró errores.
En caso de que pregunten, esta es la parte HTML:
<form id="search" action="">
<div class="toolbar">
<h1>Búsqueda</h1>
<a href="#" class="back">Atrás</a>
</div>
<ul class="rounded">
<li><input type="text" name="search-text" placeholder="Buscar" id="search-text" /></li>
</ul>
<ul class="edgetoedge" id="search-results">
<li class="sep">Resultados</li>
</ul>
</form>
¿Alguna idea de por qué sucede esto? ¡Muchas gracias de antemano!
Establecer el dataType correcto para la solicitud es un detalle importante que no se consideró en la respuesta anterior (esto hace que jQuery envíe un encabezado HTTP Accept con la solicitud - y también esperará datos JSON en la callback de éxito):
dataType: 'json',
success:function(json){
var content = '';
jQuery.each(json, function(i, v){
content += '<li>' + v.post_title + '</li>';
});
/* de esta manera los resultados no se acumularán */
jQuery("#search-results").html(content);
}
Y enviar el encabezado HTTP correcto con la respuesta tampoco se consideró:
header("content-type: application/json; charset=utf8");
Internet Explorer no es compatible con ese encabezado - pero eso es otra historia (leer más).

$.ajax({
url: 'http://mipath/wp-admin/admin-ajax.php',
data:{
'action':'go_ajax',
'fn':'spw_autosugerencia',
'queryString': $.trim(inputString.val())
},
dataType: 'JSON',
success:function(data){
// esta parte es lo que ocurre con los datos JSON
//console.log(data);
var contenido = '';
var data = $.parseJSON(data);
$.each(data, function(i, post) {
contenido += '<li>' + post.post_title + '</li>';
});
$(contenido).appendTo("#resultados-busqueda");
},
error: function(errorThrown){
alert('error');
console.log(errorThrown);
}
});

@syslogic, gracias por tomarte el tiempo. He pegado arriba el fragmento completo de Ajax que he usado todo este tiempo. Si bien probablemente tengas razón sobre que "parseJSON" es innecesario, obtenía errores nulos cuando lo omitía. Todavía estoy reflexionando sobre el problema.

- Añade
var json = jQuery.parseJSON(data);
- Define
content
añadiendovar content
- Coloca
content = '';
antes del bucle each
Así:
function (data) {
var content = '';
var json = jQuery.parseJSON(data);
$.each(json, function(i, post) {
content += '<li>' + post.post_title + '</li>';
});
$(content).appendTo("#search-results");
}

Lo entendiste bien excepto que mi servidor FTP estaba caído. ¡Lo siento y gracias!

Emm... jQuery.parseJSON(data) es bastante inútil - porque la variable "data" ya debería ser un objeto JS en el callback de la función jQuery.ajax... esto solo aplicaría si es un string JSON. Más bien asumo que envías el JSON sin los encabezados HTTP correctos.

Lo siento, tuve que votar negativo porque la respuesta era un poco engañosa, parcialmente incorrecta. Supongo que funciona así - pero la forma en que funciona no es como se supone que debería ser (enviar JSON como text/plain y luego parsearlo de nuevo no tiene sentido, es un desperdicio de energía).
