2011-02-23 24 views
34

Estoy intentando realizar algunas operaciones básicas con jQuery y JSON. Actualmente tengo dificultades con jQuery al aceptar la respuesta JSON de mi aplicación de framework de juegos. A continuación se muestra una versión simplificada del código que aún produce el error.jQuery La respuesta JSON siempre desencadena un ParseError

$.ajax({ 
    type: 'POST', 
    url: "@{FrontEnd.isUsernameAvailable()}", 
    data: "name=thisnameisavailable", 
    cache: false, 
    success: function(data) { 
     console.log("Success... "); 
    }, 
    error: function(jqXHR, textStatus, errorThrown) { 
     console.log("Error... " + textStatus + "  " + errorThrown); 
    }, 
    dataType: 'json' 
}); 

La devolución de llamada de error siempre se activa. Se muestra

error ... parsererror jQuery15001997238997904205_1298484897373 no fue llamado

Inspección de la JSON devuelto a través de Firebug no muestra los errores y las diversas herramientas de pelusa JSON también validar. Cambiar el tipo de datos a "texto" hace que se llame al éxito. Pero estoy tratando de usar la llamada isUsernameAvailable como parte del complemento de validación jQuery, así que necesito que devuelva JSON válido.

+0

¿Estás seguro de que la respuesta es del tipo application/json (creo que la respuesta es sí;)) y tu json es como {"field": "value", ...} ... la comilla doble a veces importante si sus valores son de tipo cadena y no booleanos o int ... y no huérfanos "," ... De todos modos, parece que tiene una solución alternativa. – mandubian

+0

En su pregunta mi respuesta ...Mi php estaba devolviendo el uso del eco de texto simple por lo que cambiar mi dataType a 'texto' hizo el trabajo. Gracias :) – Pitto

Respuesta

33

Quizás no entiendo bien, pero ¿no pudo establecer el dataType en text y JSON.parse() los datos devueltos?

success: function(data) { 
    data = JSON.parse(data); 
    // process data 
}, 

Editado para agregar el acuerdo general de solución (previamente un único comentario):

Me tomó un vistazo a api.jquery.com/jQuery.ajax y parece que con jQuery 1.5 que puede hacer una conversión de tipo de géneros. "valores múltiples separados por espacios: a partir de jQuery 1.5, jQuery puede convertir un tipo de datos de lo que recibió en el encabezado Content-Type a lo que necesita. Por ejemplo, si desea que una respuesta de texto se trate como XML, use" texto xml "para el tipo de datos". Tal vez puedas probar "text json".

+0

Esa puede ser la dirección en la que necesito entrar. La razón por la que "necesito" usar "json" es porque el complemento de jQuery Validation que estoy usando requiere la validación remota para devolver JSON. – Chesrae

+5

Acabo de echar un vistazo a http://api.jquery.com/jQuery.ajax/ y parece que con jQuery 1.5 puedes hacer una especie de conversión de tipo. "valores múltiples separados por espacios: a partir de jQuery 1.5, jQuery puede convertir un tipo de datos de lo que recibió en el encabezado Content-Type a lo que necesita. Por ejemplo, si desea que una respuesta de texto se trate como XML, use" texto xml "para el tipo de datos". Tal vez puedas probar "text json". – ggutenberg

+2

Acabo de cambiar "json" a "text json" en el código del complemento jQuery Validation y todo funciona perfectamente. Gracias por la respuesta, pero todavía estoy confundido por qué "json" no estaba funcionando. El encabezado Content-Type se estableció en application/json. – Chesrae

12

Recibí el mismo error tan pronto como actualicé a jQuery 1.5. Resulta que mi problema se debe a que también estoy usando el complemento de validación jquery, que no es compatible con jQuery 1.5. Si elimino el complemento de validación jquery, $ .ajax() con dataType json funciona bien.

Más información sobre la validación plugin de jQuery incompatibilidad aquí: http://bugs.jquery.com/ticket/8118

+0

Esto también me llevó un tiempo encontrarlo, este era el problema, el conflicto en jquery.validate. –

+1

La nueva versión (1.8) de jQuery Validation corrige este problema y es compatible con jQuery 1.5.x. Más información disponible en: http://jquery.bassistance.de/validate/changelog.txt –

+0

Esta es, de hecho, la respuesta correcta y debe marcarse como tal. Gracias JonnyO! – Dav

3

También me dio "parsererror jQueryNNNN_NNN no fue llamado" (usando jsonp y jQuery 1.7.2) La razón fue que uno de los valores de la la estructura json devuelta contenía nuevas líneas. Espero que esto ayude a alguien.

2

Obtuve parseerror, porque url contenía una parte callback=?. This is a magic string which activates JSONP functionality.

Como API REST de mi lado del servidor cambia de JSONP a JSON, el formato de datos devueltos por que ya no era compatible con jQuery.getJSON(..) con callback=?. En esta situación, jQuery.getJSON(..) no llamará a las devoluciones de llamada success, pero las devoluciones de llamada fail en su lugar.

Resolví este problema eliminando la parte callback=? del parámetro url.

Cuestiones relacionadas