2010-06-08 15 views
7

Ho una pagina asp.net con un WebMethod su di esso per passare JSON indietro al mio javascript.ASP.NET WebMethod Restituisce JSON racchiuso tra virgolette

Bellow è il metodo web:

[WebMethod] 
public static string getData(Dictionary<string, string> d) { 

    string response = "{ \"firstname\": \"John\", \"lastname\": \"Smith\" }"; 

    return response; 

} 

Quando questo viene restituito al client è formattato come segue:

{ \"d\": \"{ \"firstname\": \"John\", \"lastname\": \"Smith\" }\" } 

Il problema è che i doppi apici che avvolgono tutto sotto 'd'. C'è qualcosa che mi è mancato nel metodo web o altri mezzi per restituire i dati senza le virgolette? Non voglio davvero spogliarlo sul client ogni volta. Inoltre ho visto altri articoli in cui ciò non accade.

Qualsiasi aiuto sarebbe apprezzato grazie.

risposta

8

presumo che si desidera restituire la rappresentazione JSON dell'oggetto

{ 
    firstname:"John", 
    lastname:"Smith" 
} 

ma la vostra firma del metodo sta tornando una stringa. La serializzazione di framework ASP.Net è correttamente serializzando la stringa response. In altre parole, se la funzione era

string response = "foo"; 
return response; 

Non sarei sorpreso se la produzione è stata

{"d":{"foo"}} 

E 'appena il caso che ha response doppi apici che devono essere sfuggito.

Ovviamente, si vuole solo arrivare all'oggetto. Hai 2 opzioni: -

1) usa eval nel tuo javascript per trasformare la stringa in un oggetto, ad es.

function onSuccessCallback(retval) { 
    var obj = eval(retval.d); 
}` 

2) o (e questa è la mia soluzione preferita) sono il metodo di restituire un oggetto reale e lasciare che il JSON serialisationof quadro fare il lavoro pesante per voi

[WebMethod] 
public static object getData(Dictionary<string, string> d) { 
    var response = new { firstname = "John", lastname="Smith" }; 
    return response; 
} 

Vedrete che questo genera la risposta che probabilmente ci si aspettava originariamente (ad esempio {"d":{"firstname":"John", "lastname":"Smith"}}

+1

PS. Se si desidera mantenere la funzione restituendo una stringa contenente il JSON, suggerisco di utilizzare qualcosa come la funzione di estensione ToJson di Risk Strahl [http://www.west-wind.com/weblog/posts/442969.aspx]. Il tuo corpo del metodo può quindi essere nuovo {firstname = "John"}. ToJson(). –

+0

Grazie per la tua risposta, questo è molto interessante. Non mi rendevo conto che potevi creare oggetti in quel modo in C#. Tuttavia, ho già creato un framework per la creazione di stringhe json dagli oggetti, quindi dovrò utilizzare l'opzione lato client. Guarderò l'opzione lato server nei progetti futuri. Grazie. – markvpc

3

In realtà, questo intero problema esiste perché si sta tentando di pensare a servizi Web ASP.Net. È necessario impostare una classe in modo che i dati siano eturned e usa quella classe (o List (di YourClass)) per mettere in coda i risultati e restituirli.

un grande articolo che spiega tutto questo (una trappola molto comune) è: http://encosia.com/asp-net-web-services-mistake-manual-json-serialization/

-1

ho avuto un problema simile con il mio codice. Stavo cercando di restituire un XmlDocument come JSON a uno script chiamante, ma il ritorno di XmlDocument dal WebService ha restituito un set vuoto di matrici (dato che XmlDocument NON è serializzabile!).

Se ho impostato lo ScriptService con l'attributo ResponseFormat.JSON, il mio JSON è stato a doppio escape.

Il modo di fare ASP.NET è di dire a ASP.NET che si sta tornando XML e quindi non sarà doppio sfuggire al tuo JSON ;-)

[WebMethod(EnableSession = true)] 
    [ScriptMethod(ResponseFormat = ResponseFormat.Xml)] 
    public String MyJSONWebService(String sParam1, String sParam2, String sParam3) 
    { 
     ... do stuff..... 
     XmlDocument oXMLDocument = new XmlDocument(); 
     oXMLDocument.LoadXml(sXML); 
     sJSON = JsonConvert.SerializeXmlNode(oXMLDocument.SelectSingleNode("autnresponse")); 
     return sJSON; 
    } 

Lo so che è un hack, ma .....

Problemi correlati