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

У меня есть следующий код 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), я получаю "неопределенный".

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

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

EDIT2: Обновлен ответ, чтобы включить внешние кавычки. Я также использую пользовательский JavaScriptConverter для выполнения сериализации JSON. Пользовательский конвертер просто берет свойства моего объекта (в данном случае FirstName) и загружает его и его значение в коллекцию Dictionary, которую легко сериализовать в ASP.Net AJAX Extensions v1.0.

EDIT3: Рассматривая проблему, которая возникла с eval () (она вызвала ошибку Expected ";"), я заметил, что имена свойств json также заключены в кавычки. Как только я удалил кавычки из имени свойства (не значения), eval () снова заработал. Рассматривая эту проблему на стороне сервера сейчас.

Ответы [ 5 ]

5 голосов
/ 05 марта 2009

Использование jQuery .ajax выглядит убедительно. Как вы проверяете возвращенные данные? Firebug? Скрипач? Потому что .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) }

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

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

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

function(res) {
    res = eval('(' + res + ')');
    alert(res.FirstName);
}
2 голосов
/ 05 марта 2009

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

myJSON = eval (jsonString);

1 голос
/ 05 марта 2009

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

Пример:

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

РЕДАКТИРОВАТЬ: Я понимаю, что вы имеете в виду сейчас. Ваш сервис возвращает «что-то / JSON» в качестве типа MIME? Если вы посмотрите на заголовки ответов в Firebug, они должны выглядеть примерно так:

Content-Type    application/json; charset=utf-8
0 голосов
/ 16 марта 2009

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

 result = eval('(' + result.d + ')');
0 голосов
/ 05 марта 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...