Вывод возвращаемого JSON массива
У меня есть следующий 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"}]
И я использую этот JavaScript для его парсинга и вывода:
success:function(data){
$.each(data, function(i, post){
content = '';
content += '<li>' + post.post_title + '</li>';
});
$(content).appendTo("#search-results");
}
Но на экране отображается только "Undefined", и в Консоли нет ошибок.
Если вам интересно, вот HTML часть:
<form id="search" action="">
<div class="toolbar">
<h1>Поиск</h1>
<a href="#" class="back">Назад</a>
</div>
<ul class="rounded">
<li><input type="text" name="search-text" placeholder="Поиск" id="search-text" /></li>
</ul>
<ul class="edgetoedge" id="search-results">
<li class="sep">Результаты</li>
</ul>
</form>
Есть идеи почему? Заранее большое спасибо!
Установка правильного dataType для запроса — это важная деталь, не учтенная в ответе выше (это заставляет jQuery отправлять HTTP-заголовок Accept с запросом — и он также ожидает данные JSON в коллбэке success):
dataType: 'json',
success:function(json){
var content = '';
jQuery.each(json, function(i, v){
content += '<li>' + v.post_title + '</li>';
});
/* так результаты не будут накапливаться */
jQuery("#search-results").html(content);
}
Также не было учтено отправка правильного HTTP-заголовка с ответом:
header("content-type: application/json; charset=utf8");
Internet Explorer не любит этот заголовок — но это уже другая история (подробнее).

$.ajax({
url: 'http://mypath/wp-admin/admin-ajax.php',
data:{
'action':'go_ajax',
'fn':'spw_autosuggest',
'queryString': $.trim(inputString.val())
},
dataType: 'JSON',
success:function(data){
// этот блок обрабатывает JSON данные
//console.log(data);
var content = '';
var data = $.parseJSON(data);
$.each(data, function(i, post) {
content += '<li>' + post.post_title + '</li>';
});
$(content).appendTo("#search-results");
},
error: function(errorThrown){
alert('Ошибка');
console.log(errorThrown);
}
});

@syslogic, спасибо, что нашли время. Я вставил выше полный фрагмент Ajax, который использовал все это время. Хотя вы, вероятно, правы насчет того, что "parseJSON" бесполезен, у меня возникали ошибки null, когда он отсутствовал. Я все еще размышляю над этой проблемой.

- Добавьте
var json = jQuery.parseJSON(data);
- Объявите переменную
content
, добавивvar content
- Поместите
content = '';
перед циклом each
Вот так:
function (data) {
var content = '';
var json = jQuery.parseJSON(data);
$.each(json, function(i, post) {
content += '<li>' + post.post_title + '</li>';
});
$(content).appendTo("#search-results");
}

Вы были правы, просто мой FTP-сервер был недоступен. Извините и спасибо!!!

Эм... jQuery.parseJSON(data) довольно бесполезен - потому что переменная "data" уже должна быть JS-объектом в колбэке функции jQuery.ajax... это применимо только если это JSON-строка. Я скорее предполагаю, что вы отправляете JSON без HTTP-заголовков или с неправильными.

Извините, но я вынужден был поставить минус, потому что ответ был немного вводящим в заблуждение и частично неверным. Думаю, это работает так - но это не тот способ, как это должно работать (отправка JSON как text/plain и последующий его парсинг не имеет смысла, пустая трата электроэнергии).
