2010-06-08 3 views
7

J'ai une page asp.net avec un WebMethod dessus pour renvoyer JSON à mon javascript.ASP.NET WebMethod renvoie JSON entouré de guillemets

Bellow est la méthode Web:

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

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

    return response; 

} 

Lorsque cela est retourné au client, il est formaté comme suit:

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

Le problème est les guillemets doubles tout emballage sous 'd'. Y at-il quelque chose que j'ai manqué dans la méthode web ou d'autres moyens de renvoyer les données sans les guillemets? Je ne veux pas vraiment l'enlever sur le client à chaque fois. J'ai aussi vu d'autres articles où cela n'arrive pas.

Toute aide serait appréciée merci.

Répondre

8

Je suppose que vous voulez retourner la représentation JSON de l'objet

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

mais votre signature de la méthode renvoie une chaîne. La sérialisation de structure ASP.Net est correctement sérialisant la chaîne response. Autrement dit, si votre fonction était

string response = "foo"; 
return response; 

Vous ne seriez pas surpris si la sortie était

{"d":{"foo"}} 

Il arrive juste que response a des guillemets doubles qui doivent être échappé.

Vous voulez évidemment juste obtenir à l'objet. Vous avez 2 options: -

1) utilisez eval dans votre javascript pour transformer la chaîne en objet, par ex.

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

2) ou (ce qui est ma solution preferred) a votre méthode retourne un objet réel et laisser le JSON serialisationof le cadre faire le levage de charges lourdes pour vous

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

Vous verrez que cette génère la réponse que vous attendiez probablement à l'origine (par exemple, {"d":{"firstname":"John", "lastname":"Smith"}}

+1

PS. Si vous voulez garder votre fonction retournant une chaîne contenant le JSON, alors je suggère d'utiliser quelque chose comme la fonction d'extension ToJson de Risk Strahl [http://www.west-wind.com/weblog/posts/442969.aspx]. Le corps de votre méthode peut alors être nouveau {firstname = "John"}. ToJson(). –

+0

Merci pour votre réponse, c'est très intéressant. Je ne me suis pas rendu compte que vous pouviez créer des objets de cette manière en C#. Cependant, j'ai déjà créé un framework pour construire des chaînes json à partir d'objets, donc je devrai utiliser l'option côté client. Je vais regarder dans l'option côté serveur dans les futurs projets. Merci. – markvpc

3

En fait, ce problème existe parce que vous essayez de surpasser les services Web ASP.Net Vous devez configurer une classe pour vos données eturned et utilisez cette classe (ou List (of YourClass)) pour mettre les résultats en file d'attente et les retourner.

Un grand article expliquant tout cela (un piège très fréquent) est la suivante: http://encosia.com/asp-net-web-services-mistake-manual-json-serialization/

-1

J'ai eu un problème similaire avec mon code. J'essayais de renvoyer un XmlDocument en tant que JSON à un script d'appel, mais renvoyer XmlDocument à partir du WebService renvoyait un ensemble vide de tableaux (car XmlDocument n'est PAS sérialisable!).

Si j'ai défini le ScriptService avec l'attribut ResponseFormat.JSON alors mon JSON a été double-échappé.

La façon de sortir-renard ASP.NET est de dire ASP.NET que vous êtes XML de retour et il ne double échapper à votre 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; 
    } 

Je sais qu'il est un hack mais .....

Questions connexes