2011-03-13 31 views
53

Tengo problemas para obtener el contenido del objeto JSON de una llamada JQery.ajax. Mi llamado:Parse JSON de JQuery.ajax éxito datos

$('#Search').click(function() { 
    var query = $('#query').valueOf(); 
    $.ajax({ 
     url: '/Products/Search', 
     type: "POST", 
     data: query, 
     dataType: 'application/json; charset=utf-8', 
     success: function (data) { 
      alert(data); 
      for (var x = 0; x < data.length; x++) { 
       content = data[x].Id; 
       content += "<br>"; 
       content += data[x].Name; 
       content += "<br>"; 
       $(content).appendTo("#ProductList"); 
       // updateListing(data[x]); 
      } 
     } 
    }); 
}); 

Parece que el objeto JSON se devuelve correctamente porque "alerta (datos)" muestra la siguiente

[{"Id": "1", "Name": "Shirt"}, {"Id": "2", "Name":"Pants"}] 

pero cuando trato de mostrar la identificación o el nombre de la página utilizando :

content = data[x].Id; 
content += "<br>"; 
content += data[x].Name; 
content += "<br>"; 

devuelve "indefinido" a la página. ¿Qué estoy haciendo mal?

Gracias por la ayuda.

+5

Documentación ayuda. http://api.jquery.com/jQuery.ajax/ muestra que ''application/json; charset = utf-8'' no es un valor válido para 'dataType'. –

+0

Convierte a json por JSON.parse() –

Respuesta

78

Los datos vuelven como la representación de cadena del JSON y no los está convirtiendo de nuevo a un objeto JavaScript. Establezca dataType en solo 'json' para que se convierta automáticamente.

+4

@DipakYadav: 'getJSON' no POST. –

+6

@MarceloCantos (sobre su respuesta): Esto es cierto. Sin embargo, de acuerdo con [jQuery Manual] (http://api.jquery.com/jQuery.ajax/), "_ se rechaza un JSON malformado y se lanza un error de análisis. A partir de jQuery 1.9, también se rechaza una respuesta vacía_" . De modo que puede usar 'dataType: 'json'' solamente, si está seguro, ese servidor devolverá JSON con formato poperly. Si solo devuelve "_a string, que se ve como JSON_", debe usar 'dataType:" text json "' para forzar la conversión de jQuery. – trejder

+0

header ('Content-Type: application/json'); si está usando php –

2

Prueba la función de jQuery each a caminar a través de su objeto JSON:

$.each(data,function(i,j){ 
    content ='<span>'+j[i].Id+'<br />'+j[i].Name+'<br /></span>'; 
    $('#ProductList').append(content); 
}); 
5

Bueno ... que son aproximadamente 3/4 de la manera allí ... ya tiene su JSON como texto.

El problema es que parece que está manejando esta cadena como si ya fuera un objeto JavaScript con propiedades relacionadas con los campos que se transmitieron.

No es ... es solo una cadena.

Consultas como "content = data [x] .Id;" están destinados a fallar porque JavaScript no está encontrando estas propiedades unidas a la cadena que está mirando ... otra vez, es SÓLO una cadena.

Debería poder simplemente analizar los datos como JSON mediante ... yup ... el método de análisis del objeto JSON.

myResult = JSON.parse(request.responseText); 

Ahora myResult es un objeto javascript que contiene las propiedades que se transmitieron a través de AJAX.

Eso debería permitirle manejarlo de la forma en que parece estar intentándolo.

Parece que se agregó JSON.parse cuando se agregó ECMA5, por lo que cualquier elemento bastante moderno debería ser capaz de manejarlo de forma nativa ... si tiene que manipular fósiles, también puede probar con bibliotecas externas para manejarlo, como jQuery o JSON2.

Para el registro, esto ya fue respondida por Andy E para otra persona HERE.

edición - Sierra de la solicitud de 'fuentes oficiales o creíbles', y probablemente uno de los codificadores que me parece el más creíble sería John Resig ~ ECMA5 JSON ~ me hubiera unido a la especificación ECMA5 real en relación nativa JSON soporte, pero preferiría recomendar a alguien a un maestro como Resig que una especificación seca.

51

le recomiendo que utilice:

var returnedData = JSON.parse(response); 

para convertir la cadena JSON (si es sólo texto) para un objeto de JavaScript.

+1

@RyanGates, creo que abobreshov está hablando de 'éxito simple: función (datos) {datos = JSON.parse (datos);}', si no me equivoco. – trejder

+0

Claro, lo dije en serio – abobreshov

3

puede utilizar el método jQuery parseJSON:

var Data = $.parseJSON(response); 
6

Una de las manera se puede asegurar que este tipo de error (el uso de cadena en lugar de JSON) no sucede es ver lo que se imprime en el alert. Cuando lo haga

alert(data) 

si los datos son una cadena, imprimirá todo lo que contenga. Sin embargo, si imprime es un objeto json. obtendrá la siguiente respuesta en la alerta

[object Object] 

Si la respuesta entonces usted puede estar seguro de que usted puede utilizar esto como un objeto JSON (en este caso).

Por lo tanto, es necesario convertir la cadena en JSON en primer lugar, antes de utilizarlo al hacer esto:

JSON.parse(data) 
0

De la API de jQuery: con el ajuste de dataType, Si no se especifica ninguno, jQuery intentará inferirlo con $.parseJSON() basado en el tipo MIME (el tipo MIME para el texto JSON es "application/json") de la respuesta (en 1.4 JSON arrojará un objeto JavaScript).

O puede configurar el dataType en json para convertirlo automáticamente.

0

No estoy seguro de qué va mal con su configuración. Quizás el servidor no está configurando los encabezados correctamente. No es seguro. Como una posibilidad muy remota, puede probar este

$.ajax({ 
    url : url, 
    dataType : 'json' 
}) 
.done(function(data, statusText, resObject) { 
    var jsonData = resObject.responseJSON 
}) 
3

Es un trabajo, por ejemplo

.ajax({ 

      url: "http://localhost:11141/Search/BasicSearchContent?ContentTitle=" + "تهران", 
      type: 'GET', 
      cache: false, 
      success: function (result) { 

       // alert(jQuery.dataType); 
       if (result) { 
        // var dd = JSON.parse(result); 
        alert(result[0].Id) 
       } 

      }, 
      error: function() { 
       alert("No"); 
      } 
     }); 

Por último, es necesario utilizar esta declaración ...

result[0].Whatever 
Cuestiones relacionadas