Como posso interpretar JSON retornado de jQuery.ajax e usando uma ação POST?
Pergunta
Eu tenho o seguinte código 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);}
});
A chamada para o método retorna o seguinte:
"{"FirstName":"James"}"
Quando eu chegar o valor de volta, meu alerta retorna a string json completo. Se eu tento fazer alert(msg.FirstName)
, eu fico "indefinido".
Eu vi um monte de exemplos usando o método getJSON (); no entanto, eu não vi uma maneira de usar que para um POST verbo. Alguém pode me apontar na direção certa para onde estou indo errado? Com base na documentação do jQuery, o valor de retorno deve ser o mesmo tipo de dados (JSON) então eu não tenho certeza do que eu estou sentindo falta.
EDIT: Eu olhei no meu serviço, e que está combinando exemplos que eu estou encontrando em termos de assinatura do método retornando um string. Eu também confirmou o tipo de resposta é de application / json.
EDIT2: Atualizado a resposta para incluir as cotações externas. Eu também estou usando um JavaScriptConverter costume de fazer a serialização JSON. O conversor personalizado só leva minhas propriedades do objeto (neste caso FirstName) e carrega-lo e é valor em uma coleção dicionário que o v1.0 ASP.Net AJAX Extensions pode serializar facilmente.
EDIT3:
Olhando para o problema que eu estava tendo com eval () (que causou um erro Expected ";"
), notei que os nomes das propriedades JSON também foram colocados entre aspas. Uma vez eu removi as aspas do nome da propriedade (não o valor), eval () trabalhou novamente. Olhando para o lado do servidor desta questão agora.
Solução
O uso jQuery .ajax
parece sólido. Como você está verificando os dados retornados? Firebug? Violinista? Porque webservices .asmx
não retornam dados como {"FirstName":"James"}
. As respostas parecem mais com:
{"d":{"FirstName":"James"}}
(Veja http: //encosia.com/2008/03/27/using-jquery-to-consume-aspnet-json-web-services/ )
Para o seu retorno success
, tente:
function(res) { alert(res.d.FirstName) }
Editar : Serra suas atualizações e comentário re v1.0 do ASP.Net AJAX:
Eu não sou positivo como funciona v1.0 wrt serialização sua resposta, mas meu palpite é que você está fazendo o seu próprio serialização JSON personalizado em seu método de WebService, a resposta pode estar recebendo JSON serializado novamente . Então você está serialização duas vezes.
Eu acredito que todos os componentes que você está usando estão fazendo o que é suposto, é só agora suas necessidades de retorno de chamada success
para unserialize manualmente desde que você está serialização manualmente no servidor:
function(res) {
res = eval('(' + res + ')');
alert(res.FirstName);
}
Outras dicas
IIRC você pode eval a corda, e o resultado será o objeto JSON.
= myJSON Eval (jsonString);
Você pode definir suas variáveis ??post com um objeto JSON como o segundo parâmetro.
Exemplo:
$.getJSON("service.py",
{ foo: bar },
function(data) {
$.each(data, function() { // blah });
}
);
EDIT: Eu vejo o que você quer dizer agora. Será que o seu retorno serviço "algo / json" como o tipo MIME? Se você está olhando para os cabeçalhos de resposta em Firebug, deve ser algo como isto:
Content-Type application/json; charset=utf-8
Tente algo parecido com isto:
result = eval('(' + result.d + ')');
Você não pode usar $getJSON
com serviços ASMX serializados através System.Web.Extensions
. Você está fazendo a chamada corretamente com $.ajax()
.
Você tentou usando o Firebug para definir um ponto de interrupção dentro do manipulador de sucesso e inspecionar o msg valor?