Разбор JSON из JQuery.данные успехи "Аякса"
у меня возникли проблемы с получением содержимого объекта JSON из JQery.AJAX-вызов. Мой звонок:
$('#Search').click(function () {
var query = $('#query').valueOf();
$.ajax({
url: '/Products/Search',
type: "POST",
data: query,
dataType: 'application/json; charset=utf-8',
success: function (data) {
alert(data);
for (var x = 0; x < data.length; x++) {
content = data[x].Id;
content += "<br>";
content += data[x].Name;
content += "<br>";
$(content).appendTo("#ProductList");
// updateListing(data[x]);
}
}
});
});
кажется, что объект JSON возвращается правильно, потому что" alert(data) " отображает следующее
[{"Id": "1", "Name": "Shirt"}, {"Id": "2", "Name":"Pants"}]
но когда я пытаюсь отобразить идентификатор или имя на странице с помощью:
content = data[x].Id;
content += "<br>";
content += data[x].Name;
content += "<br>";
он возвращает" undefined " на страницу. Что я делаю не так?
Спасибо за помощь.
9 ответов:
данные возвращаются как строковое представление JSON, и вы не преобразуете его обратно в объект JavaScript. Установите
dataType
просто'json'
чтобы он был преобразован автоматически.
Я рекомендую вам использовать:
var returnedData = JSON.parse(response);
преобразовать строку JSON (если это просто текст) в объект JavaScript.
один из способов, которым вы можете гарантировать, что этот тип ошибки (используя строку вместо json) не произойдет, - это увидеть, что печатается в
alert
. Когда вы делаетеalert(data)
если данные являются строкой,он будет печатать все, что содержит. Однако, если вы печатаете объект json. вы получите следующий ответ В предупреждения
[object Object]
если это ответ, то вы можете быть уверены, что вы можете использовать это как объект (json в этом случае).
таким образом, вы сначала нужно преобразовать строку в json, прежде чем использовать ее, сделав это:
JSON.parse(data)
хорошо... вы находитесь примерно на 3/4 пути туда... у вас уже есть JSON в качестве текста.
проблема в том, что вы, кажется, обрабатываете эту строку, как будто это уже объект JavaScript со свойствами, относящимися к полям, которые были переданы.
Это не так... это просто строка.
запросы типа " content = data[x]. Id;" обречены на неудачу, потому что JavaScript не находит эти свойства, прикрепленные к строке, на которую он смотрит... снова, это просто строка.
вы должны быть в состоянии просто проанализировать данные как JSON через... ага... метод parse объекта JSON.
myResult = JSON.parse(request.responseText);
теперь myResult-это объект javascript, содержащий свойства, которые были переданы через AJAX.
Это должно позволить вам справиться с этим так, как вы, кажется, пытаетесь.
похоже на JSON.разбор был добавлен, когда был добавлен ECMA5, поэтому все довольно современное должно быть в состоянии справиться с этим изначально... если вы должны обрабатывать окаменелости, вы также можете попробовать внешние библиотеки для обработки этого, такие как jQuery или JSON2.
для протокола, на это уже ответил Энди E для кого-то другого здесь.
edit - видел запрос на "официальные или достоверные источники", и, вероятно, одним из кодеров, который я считаю наиболее вероятным, был бы Джон в отставку ~ ECMA5 JSON ~ я бы связался с фактическим Ecma5 spec относительно родной поддержки JSON, но я бы предпочел направить кого-то к мастеру, такому как Resig, чем сухая спецификация.
это работа, например
.ajax({ url: "http://localhost:11141/Search/BasicSearchContent?ContentTitle=" + "تهران", type: 'GET', cache: false, success: function (result) { // alert(jQuery.dataType); if (result) { // var dd = JSON.parse(result); alert(result[0].Id) } }, error: function () { alert("No"); } });
наконец, вам нужно использовать это утверждение ...
result[0].Whatever
попробуйте jquery
each
функция, чтобы пройти через ваш объект json:$.each(data,function(i,j){ content ='<span>'+j[i].Id+'<br />'+j[i].Name+'<br /></span>'; $('#ProductList').append(content); });
из API jQuery: с настройкой
dataType
, Если ничего не указано, jQuery попытается вывести его с помощью$.parseJSON()
на основе типа MIME (тип MIME для текста JSON - "application/json") ответа (в 1.4 JSON будет получен объект JavaScript).
илиdataType
доjson
преобразовать его автоматически.
Я не уверен, что происходит не так с вашей настройкой. Возможно, сервер не устанавливает заголовки должным образом. Не уверенный. Как длинный выстрел, вы можете попробовать это
$.ajax({ url : url, dataType : 'json' }) .done(function(data, statusText, resObject) { var jsonData = resObject.responseJSON })