Как я могу интерпретировать JSON, возвращенный из jQuery.ajax и использующий действие POST?

StackOverflow https://stackoverflow.com/questions/612515

  •  03-07-2019
  •  | 
  •  

Вопрос

У меня есть следующий код jQuery:

$.ajax({
    type: "POST",
    url: "Services/MyService.asmx/Select",
    dataType: "json",
    data: "{'data':'test'}",
    contentType: "application/json; charset=utf-8",
    success: function(msg){ 
                alert(msg); 
             },
    error: function(xhr){ alert(xhr.statusText);}                
});

Вызов метода возвращает следующее:

"{"FirstName":"James"}"

Когда я получаю значение обратно, мое оповещение возвращает полную строку json.Если я попытаюсь сделать alert(msg.FirstName), Я получаю "undefined".

Я видел много примеров использования метода getJSON();однако я не видел способа использовать это для глагола POST.Кто-нибудь может указать мне в правильном направлении, где я иду не так?Основываясь на документации jquery, возвращаемое значение должно быть того же типа данных (json), поэтому я не уверен, чего мне не хватает.

Редактировать:Я посмотрел на свой сервис, и он соответствует примерам, которые я нахожу в терминах сигнатуры метода, возвращающей строку.Я также подтвердил, что тип ответа - application / json.

РЕДАКТИРОВАТЬ 2:Обновил ответ, включив в него внешние кавычки.Я также использую пользовательский JavaScriptConverter для выполнения сериализации JSON.Пользовательский конвертер просто берет свойства моего объекта (в данном случае FirstName) и загружает его и его значение в коллекцию словарей, которую ASP.Net AJAX Extensions v1.0 могут легко сериализовать.

РЕДАКТИРОВАТЬ 3:Изучая проблему, с которой я столкнулся с eval() (это вызвало Expected ";" ошибка), я заметил, что имена свойств json также были заключены в кавычки.Как только я удалил кавычки из имени свойства (не из значения), eval() снова заработал.Сейчас изучаю серверную часть этой проблемы.

Это было полезно?

Решение

С помощью jQuery .ajax использование выглядит солидно.Как вы проверяете возвращенные данные?Поджигатель?Скрипач?Потому что .asmx веб-сервисы не возвращают такие данные, как {"FirstName":"James"}.Ответы больше похожи:

{"d":{"FirstName":"James"}}

(См. http://encosia.com/2008/03/27/using-jquery-to-consume-aspnet-json-web-services/)

Для вашего success обратный звонок, попробуйте:

function(res) { alert(res.d.FirstName) }

Редактировать:Видел ваши обновления и комментарии к версии 0 ASP.Net AJAX:

Я не уверен, как версия v1.0 работает с сериализацией вашего ответа, но я предполагаю, что если вы выполняете свою собственную пользовательскую сериализацию JSON в своем методе WebService, ответ может быть сериализован в формате JSON снова.Итак, вы сериализуете дважды.

Я верю, что все компоненты, которые вы используете, делают то, что они должны, просто теперь ваш success обратный вызов необходимо отменить вручную, так как вы выполняете сериализацию вручную на сервере:

function(res) {
    res = eval('(' + res + ')');
    alert(res.FirstName);
}

Другие советы

IIRC вы можете вычислить строку, и результатом будет объект json.

myJSON = вычисление(jsonString);

Вы можете определить свои переменные post с помощью объекта JSON в качестве второго параметра.

Пример:

$.getJSON("service.py",
    { foo: bar },
    function(data) {
        $.each(data, function() { // blah });
    }
);

Редактировать:Теперь я понимаю, что ты имеешь в виду.Возвращает ли ваш сервис "something / json" в качестве MIME-типа?Если вы смотрите на заголовки ответов в Firebug, это должно выглядеть примерно так:

Content-Type    application/json; charset=utf-8

попробуйте что-то вроде этого :

 result = eval('(' + result.d + ')');

Вы не можете использовать $getJSON с сервисами ASMX , сериализованными через System.Web.Extensions.Вы правильно выполняете вызов с $.ajax().

Вы пробовали использовать Firebug для установки точки останова внутри обработчика успеха и проверки msg ценность?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top