2010-06-08 34 views
7

Tengo una página asp.net con un WebMethod para pasar JSON a mi javascript.ASP.NET WebMethod Devuelve JSON envuelto entre comillas

Bellow es el método web:

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

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

    return response; 

} 

Cuando esto se devuelve al cliente se le da formato de la siguiente manera:

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

El problema es que las comillas dobles que envuelven todo bajo 'd'. ¿Hay algo que he omitido en el método web o algún otro medio de devolver los datos sin las comillas? Realmente no quiero despojarlo del cliente cada vez. También he visto otros artículos donde esto no sucede.

Cualquier ayuda sería apreciada gracias.

Respuesta

8

Asumo que desea devolver la representación JSON del objeto

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

pero su firma método devuelve una cadena. La serialización de marco de ASP.Net está correctamente serializando la cadena response. Dicho de otra manera, si su función era

string response = "foo"; 
return response; 

No me sorprendería que la salida era

{"d":{"foo"}} 

Lo que ocurre es que response tiene comillas dobles que necesitan ser escapado.

Obviamente, solo quiere llegar al objeto. Tiene 2 opciones: -

1) use eval en su javascript para convertir la cadena en un objeto, p.

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

2) o (y esto es mi solución preferida) haga que su método de devolver un objeto real y dejar que el JSON serialisationof el marco haga el trabajo pesado para usted

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

Usted verá que esta genera la respuesta que probablemente esperaba originalmente (por ejemplo {"d":{"firstname":"John", "lastname":"Smith"}}

+1

PS. Si desea que su función devuelva una cadena que contenga el JSON, le sugiero que use algo como la función de extensión ToJson de Risk Strahl [http://www.west-wind.com/weblog/posts/442969.aspx]. El cuerpo de su método puede ser nuevo {firstname = "John"}. ToJson(). –

+0

Gracias por su respuesta, esto es muy interesante. No me di cuenta de que podías crear objetos de esa manera en C#. Sin embargo, ya he creado un marco para construir cadenas json a partir de objetos, así que tendré que usar la opción del lado del cliente. Examinaré la opción del servidor en futuros proyectos. Gracias. – markvpc

3

en realidad existe toda esta cuestión, porque usted está tratando de pensar fuera de los servicios Web ASP.NET. necesita configurar una clase para que sus datos sean r creó y usa esa clase (o Lista (de YourClass)) para poner en cola los resultados y devolverlos.

Un gran artículo que explica todo esto (una trampa muy común) es: http://encosia.com/asp-net-web-services-mistake-manual-json-serialization/

-1

tuve un problema similar con mi código. Estaba intentando devolver un XmlDocument como JSON a un script de llamada, pero devolver XmlDocument del WebService devolvió un conjunto vacío de matrices (¡ya que XmlDocument NO es serializable!).

Si configuro el ScriptService con el atributo ResponseFormat.JSON, entonces mi JSON se escapó por partida doble.

El camino a out-fox ASP.NET es decirle a ASP.NET que usted está volviendo XML y entonces no va a escapar de su doble 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; 
    } 

Sé que es un truco, pero .....

Cuestiones relacionadas