Come posso interpretare JSON restituito da jQuery.ajax e usando un'azione POST?

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

  •  03-07-2019
  •  | 
  •  

Domanda

Ho il seguente codice 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);}                
});

La chiamata al metodo restituisce quanto segue:

"{"FirstName":"James"}"

Quando ottengo il valore indietro, il mio avviso restituisce la stringa json completa. Se provo a fare alert (msg.FirstName) , ottengo " undefined " ;.

Ho visto molti esempi usando il metodo getJSON (); tuttavia, non ho visto un modo per usarlo per un verbo POST. Qualcuno può indicarmi la giusta direzione dove sto sbagliando? Sulla base della documentazione di jquery, il valore di ritorno dovrebbe essere lo stesso dataType (json), quindi non sono sicuro di cosa mi manchi.

EDIT: Ho esaminato il mio servizio e sono gli esempi corrispondenti che trovo in termini di firma del metodo che restituisce una stringa. Ho anche confermato che il tipo di risposta è application / json.

EDIT2: Aggiornata la risposta per includere le virgolette esterne. Sto anche usando un JavaScriptConverter personalizzato per eseguire la serializzazione JSON. Il convertitore personalizzato prende semplicemente le proprietà del mio oggetto (in questo caso FirstName) e lo carica e ha valore in una raccolta di dizionari che ASP.Net AJAX Extensions v1.0 può serializzare facilmente.

Edit3: Esaminando il problema che stavo riscontrando con eval () (causava un errore Expected " ;; " ), ho notato che anche i nomi delle proprietà json erano racchiusi tra virgolette. Una volta rimosse le virgolette dal nome della proprietà (non dal valore), eval () ha funzionato di nuovo. Esaminando il lato server di questo problema ora.

È stato utile?

Soluzione

L'uso di jQuery .ajax sembra solido. Come stai verificando i dati restituiti? Firebug? Violinista? Perché i servizi web .asmx non restituiscono dati come {" FirstName ": " James "} . Le risposte sembrano più simili:

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

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

Per il callback successo , prova:

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

Modifica : ho visto gli aggiornamenti e i commenti su v1.0 di ASP.Net AJAX:

Non sono sicuro di come v1.0 funzioni per serializzare la tua risposta, ma suppongo che se stai eseguendo la tua serializzazione JSON personalizzata nel tuo metodo WebService, la risposta potrebbe essere la serializzazione JSON di nuovo . Quindi stai serializzando due volte.

Credo che tutti i componenti che stai usando stiano facendo quello che dovrebbero, è proprio ora che il tuo callback successo deve essere serializzato manualmente poiché stai serializzando manualmente sul server:

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

Altri suggerimenti

IIRC puoi valutare la stringa e il risultato sarà l'oggetto json.

myJSON = eval (jsonString);

Puoi definire le tue variabili post con un oggetto JSON come secondo parametro.

Esempio:

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

EDIT: vedo cosa intendi ora. Il tuo servizio restituisce " qualcosa / json " come tipo MIME? Se stai esaminando le intestazioni di risposta in Firebug, dovrebbe essere simile a questo:

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

prova qualcosa del genere:

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

Non puoi usare $ getJSON con i servizi ASMX serializzati tramite System.Web.Extensions . Stai effettuando la chiamata correttamente con $ .ajax () .

Hai provato a utilizzare Firebug per impostare un punto di interruzione all'interno del gestore del successo e ispezionare il valore msg ?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top