Como posso interpretar JSON retornado de jQuery.ajax e usando uma ação POST?

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

  •  03-07-2019
  •  | 
  •  

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.

Foi útil?

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?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top