2011-01-19 22 views
7

Hola, tengo un script de contacto en árabe que usa Ajax para recuperar una respuesta del servidor después de completar el formulario.¿Por qué jQuery.parseJSON() no funciona en todos los servidores?

En algunos servidores apache, jQuery.parseJSON() arroja una excepción invalid json para el mismo json que analiza perfectamente en otros servidores. Esta excepción se produce solo en Chrome y IE.

El contenido json se codifica utilizando la función json_encode() de php. Intenté enviar el encabezado correcto con los datos json y configurar el Unicode en utf-8, pero eso no ayudó.

Ésta es una de las respuestas JSON que trato de analizar (eliminado la segunda parte de si, porque es largo):

{"pageTitle":"\u062e\u0637\u0623 \u0639\u0646\u062f \u0627\u0644\u0625\u0631\u0633\u0627\u0644 !"}

Nota: Este lenguaje de estos datos es el árabe, por eso se ve así después de haber sido analizado con php's json_encode().

Puede intentar hacer una solicitud en los ejemplos dados y ver los datos de respuesta completos usando las herramientas de desarrollador firebug o webkit. ¡La respuesta pasa jsonlint!

Finalmente, tengo dos direcciones URL que usan la misma versión de la secuencia de comandos, trato de buscarlas usando Chrome o IE para ver el error en el ejemplo roto.

El ejemplo de trabajo: http://namodg.com/n/

El ejemplo rota: http://www.mt-is.co.cc/my/call-me/

Actualizado: Para aclarar más, me gustaría señalar que me manejadas para solucionar este problema mediante el uso de la vieja eval() para analizar el contenido, publiqué otra versión con esta corrección, fue así:

// Parse the JSON data 
try 
{ 
    // Use jquery's default parser 
    data = $.parseJSON(data); 
} 
catch(e) 
{ 
    /* 
    * Fix a bug where strange unicode chars in the json data makes the jQuery 
    * parseJSON() throw an error (only on some servers), by using the old eval() - slower though! 
    */ 
    data = eval("(" + data + ")"); 
} 

Todavía quiero saber si esto es un error en el método parseJSON() de jquery, por lo que puedo reportarlo.

+0

No encuentro ningún caso de eval o parseJSON en ninguno de los dos ejemplos. ¿Puede darnos una pista de la ubicación donde se analiza el JSON? Además, su ejemplo analiza bien con jQuery.parse en cromo – phihag

+0

Lancé otra versión 1.3.1 que usa 'eval()', puede verla aquí: http://namodg.com/try (Está debajo del 'enviar 'método en namodg.main.js). parseJSON se usa automáticamente cuando '$ .ajax' dataType se establece en' json'. – Maher4Ever

Respuesta

6

¡Encontró el problema! Fue muy difícil de notar, pero vi algo gracioso sobre la abrazadera de apertura ... parecía que había un par de pequeños puntos cerca. He utilizado este bookmarklet Javascript para averiguar lo que era:

javascript:window.location='http://www.google.com/search?q=u+'+('000'+prompt('String?').charCodeAt(prompt('Index?')).toString(16)).slice(-4) 

que tiene the results page. Adivina cuál es el problema! Hay un personaje invisible, repetido dos veces en realidad, al comienzo de su salida. El espacio de no separación de ancho cero también se llama marca de orden de bytes Unicode (BOM). Es la razón por la cual jQuery rechaza su JSON, que de otro modo sería válido, y por qué funciona misteriosamente pegar el JSON en JSONLint (dependiendo de cómo lo haga).

Una forma de obtener este carácter no deseado en su salida es guardar sus archivos PHP usando el Bloc de notas de Windows en modo UTF-8. Si esto es lo que está haciendo, obtenga otro editor de texto como Notepad++. Vuelva a guardar todos sus archivos PHP sin la lista de materiales para solucionar su problema.

Paso 1: Configure Notepad ++ para codificar archivos en UTF-8 sin BOM por defecto. UTF-8 without BOM setting in New Document tab of Preferences

Paso 2: Abrir cada archivo PHP existentes, cambiar la configuración de codificación, y volver a guardarlo. Encoding...Encode in UTF-8 without BOM

+1

Señor, no puedo agradecerle lo suficiente. He tenido todo tipo de problemas debido a la lista de materiales, pero siempre me aseguro de guardar mis archivos sin lista de materiales. Lo que sucedió fue que el tipo que tiene el servidor dañado guardó el archivo con la codificación incorrecta después de que él cambió el archivo de configuración. Todavía necesitaré usar la corrección 'eval()' para los usuarios que cometerán el mismo error, pero al menos ahora sé la causa del problema. :) – Maher4Ever

1

debería intentar usar json2.js (está en https://github.com/douglascrockford/JSON-js)

Incluso John Resig (creador de jQuery) dice que debe hacerlo:

Esta versión de JSON.js es muy recomendable. Si todavía está utilizando la versión anterior, actualice (esta, sin duda, causa menos problemas que la anterior).

http://ejohn.org/blog/the-state-of-json/

+0

Gracias por señalar este analizador, pero ¿por qué el equipo de jQuery no utilizó esta nueva API en lugar de la suya propia? – Maher4Ever

+0

No puedo averiguar en qué versión de jquery se incluyó, pero probablemente no en 1.3.1 porque hay un ticket http://bugs.jquery.com/ticket/4990 para incluirlo en la versión 1.3.2. – ajma

0

no veo nada relacionado con parseJSON()

La única diferencia que veo es que en el ejemplo de trabajo de una sesión de cookie se establece (supongo que es necesaria para la "captcha", el cálculo matemático), en el otro ejemplo no se establece cookie de sesión. Entonces, tal vez la comparación del resultado del cálculo falle sin la cookie de sesión.

+0

La respuesta del captcha está dentro de un campo oculto cifrado con una clave, por lo que no requiere la sesión en absoluto. Los encabezados de las respuestas de los servidores son casi idénticos, ¡pero uno rompe el método 'parseJSON'! – Maher4Ever

Cuestiones relacionadas