¿Cómo puedo interpretar el JSON devuelto desde jQuery.ajax y usar una acción POST?

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

  •  03-07-2019
  •  | 
  •  

Pregunta

Tengo el siguiente 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);}                
});

La llamada al método devuelve lo siguiente:

"{"FirstName":"James"}"

Cuando recupero el valor, mi alerta devuelve la cadena json completa. Si intento hacer alert (msg.FirstName) , obtengo " undefined " ;.

He visto muchos ejemplos con el método getJSON (); sin embargo, no he visto una forma de usar eso para un verbo POST. ¿Alguien me puede indicar la dirección correcta en la que me voy mal? Según la documentación de jquery, el valor de retorno debe ser el mismo dataType (json), por lo que no estoy seguro de lo que me estoy perdiendo.

EDITAR: Busqué en mi servicio y son ejemplos coincidentes que estoy encontrando en términos de la firma del método que devuelve una cadena. También he confirmado que el tipo de respuesta es de application / json.

EDIT2: Se actualizó la respuesta para incluir las citas externas. También estoy usando un convertidor de JavaScript personalizado para realizar la serialización JSON. El convertidor personalizado simplemente toma mis propiedades de objeto (en este caso, Nombre) y las carga y su valor en una colección de diccionarios que ASP.Net AJAX Extensions v1.0 puede serializar fácilmente.

EDIT3: Al analizar el problema que estaba teniendo con eval () (causó un error Esperado " ;; " ), noté que los nombres de las propiedades json también estaban entre comillas. Una vez que eliminé las comillas del nombre de la propiedad (no el valor), eval () funcionó nuevamente. Mirando el lado del servidor de este problema ahora.

¿Fue útil?

Solución

El uso de jQuery .ajax parece sólido. ¿Cómo está verificando los datos devueltos? Firebug? ¿Violinista? Porque los servicios web .asmx no devuelven datos como {" FirstName ": " James "} . Las respuestas se parecen más a:

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

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

Para su devolución de llamada success , intente:

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

Editar : vio sus actualizaciones y comentarios en la versión 1.0 de ASP.Net AJAX:

No estoy seguro de cómo funciona v1.0 y serializar su respuesta, pero supongo que si está realizando su propia serialización JSON personalizada en su método de servicio web, la respuesta puede estar obteniendo JSON serializado de nuevo . Así que estás serializando dos veces.

Creo que todos los componentes que está utilizando están haciendo lo que se supone que deben hacer, es justo ahora que su devolución de llamada éxito necesita deserializar manualmente ya que está serializando manualmente en el servidor:

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

Otros consejos

IIRC puedes evaluar la cadena, y el resultado será el objeto json.

myJSON = eval (jsonString);

Puedes definir tus variables de publicación con un objeto JSON como segundo parámetro.

Ejemplo:

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

EDITAR: Veo lo que quieres decir ahora. ¿Devuelve su servicio " algo / json " como el tipo MIME? Si está viendo los encabezados de respuesta en Firebug, debería verse algo como esto:

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

prueba algo como esto:

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

No puede usar $ getJSON con los servicios ASMX serializados a través de System.Web.Extensions . Estás haciendo la llamada correctamente con $ .ajax () .

¿Ha intentado usar Firebug para establecer un punto de interrupción dentro del controlador de éxito e inspeccionar el valor msg ?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top