Разбор 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 60

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, чем сухая спецификация.

вы можете использовать метод jQuery parseJSON:

var Data = $.parseJSON(response);

это работа, например

.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
})