Как я могу интерпретировать JSON, возвращенный из jQuery.ajax и использующий действие POST?
Вопрос
У меня есть следующий код 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 ценность?