Me estoy poniendo un «no bien formado» error en la consola de errores de Firefox 3.0.7 cuando el JavaScript en mi página carga un archivo de texto que contiene un objeto en JavaScript Object Notation formato. Si el archivo no contiene nada, pero el objeto JSON, se produce el error. Si me envuelve el objeto en <documento></documento> etiquetas que no produce el error. La solicitud se realiza correctamente, de cualquier manera, así que yo sólo podía ignorar, pero no quiero que mi error llenar el registro con estos mensajes.

Aquí está el código de ejemplo para ilustrar el problema. En primer lugar, la «no-forma» archivo llamado «de datos.json»:

{ a: 3 }

Ahora el código para cargar el archivo:

var req = new XMLHttpRequest();
req.open("GET", "data.json");
req.send(null);

El cual se produce el siguiente error en la consola de errores de Firefox:

no bien formado

file://ruta/a/los datos.json Línea: 1

{ a: 3 }

– ^

Si de datos.json es modificado para esto:

<document>{ a: 3 }</document>

No hay ningún error. Supuse que no se queja porque la llanura archivo JSON no es un documento XML bien formado, así que he intentado anular el tipo MIME antes de «enviar» llamado a la fuerza a la carga, como texto sin formato, pero que no funcionó.

var req = new XMLHttpRequest();
req.open("GET", "data.json");
req.overrideMimeType("text/plain");
req.send(null);
//Still produces an error!

Voy a seguir con envolver mis datos JSON en un documento XML para obtener todo lo que la validación de la XMLHttpRequest está realizando, pero me gustaría saber si hay alguna manera de que se me de la fuerza para cargar sólo texto sin formato acríticamente y no tratar de validar. Alternativamente, existe otro método de carga de datos, además de XMLHttpRequest, que puede ser utilizado con texto sin formato?

InformationsquelleAutor A. Levy | 2009-03-24

8 Comentarios

  1. 71

    Has probado a utilizar el tipo MIME para JSON?

    application/json

    También puede configurar su servidor para enviar este tipo de MIME automáticamente .json archivos.

    • Esto funciona, gracias!
    • Para ser más específicos: req.overrideMimeType(«application/json»); req.send(null); obras. Especificar el tipo MIME en el servidor sería la mejor solución, pero es primordial que funciona tan bien.
    • Esto es genial! A mí me funciona. Gracias!
    • Cómo configurar el tipo?
    • Donde debe ser colocado? En el archivo JSON?
    • Es posible tener una solución al desarrollo local?

  2. 20

    En primer lugar, la verdadera JSON es mucho más estricto que el de JavaScript, y para ser válida, JSON, usted tiene que tener sus llaves citado.

     { "a": 3 } 

    También, como usted está usando un desnudo de XMLHttpRequest, que en general se espera recibir un resultado XML menos encabezados MIME especificar estrictamente lo contrario.

    Sin embargo, usted puede desear para hacer su vida más fácil, simplemente usando un framework JavaScript, como jQuery, que se abstraen de todo este problema para usted y para tratar con todas las desagradables casos de borde.

    $.getJSON("data.json",{}, function( data ){ 
      /*  # do stuff here  */ 
    });

    Además, si utiliza el estricto JSON y uso de la biblioteca, para abstracto para usted, cuando los navegadores comienzan a tener JSON nativo de los analizadores de la biblioteca podrá, de forma transparente a hacer uso de estos y obtener una importante mejora de la velocidad.

    ( Este está programado para pasar más pronto que tarde, y cuando esto sucede, sus usuarios tendrán una actualización silenciosa, sin ningún esfuerzo necesario! ).

    • Gracias por los punteros en JSON. Voy a cambiar mis datos para utilizar la cadena entre comillas los nombres de atributo. Por desgracia, jQuery, o algún otro framework, no es una opción para mí.
    • Yo estaría más interesada por qué, en general, que es la señal de código-hedor vehemencia evitar la reutilización de código y evitar el uso de problemas resueltos.
    • esta debe ser la verdadera respuesta…
    • Yo estaría feliz de usar jQuery. Sin embargo, el proceso de aprobación para el uso de jQuery es excesivamente difícil. La cantidad de tiempo que se necesitaría para discutir con el cliente y demostrar que tenemos uso de jQuery es que no vale la pena el beneficio. Triste, pero cierto.
    • Levy: usted va a aprender, y la próxima vez que usted será menos probable que el código a mano-todo 🙂
    • el uso de $.getJSON() todavía genera ese mensaje de error para mí.
    • se que la codificación de los datos correctamente? Como se ha dicho, que DEBE codificar las claves y valores de forma adecuada, vea jsfiddle.net/kentnl/uGDQP/1 para los ejemplos.

  3. 5

    Esto también ocurre cuando el Tipo de Contenido está completamente vacía (eludiendo el tipo natural de detección).

  4. 3

    Me encontré con el mismo mensaje de error pero de una causa diferente. Después de un poco de tiempo infructuosamente de cambiar el contenido JSON, se dio cuenta de que accidentalmente había reiniciado la página que se ejecutan al sistema de archivos local (file://Users/me/Sites/mypage.html) en lugar de por el servidor (http://localhost/~me/Sites/mypage.html).

  5. 1

    Yo también estaba recibiendo el mismo mensaje de advertencia con XMLHttpRequest() (en FireFox), cuando solicitando los recursos marcados como Content-Type: application/json por el servidor.

    Lo que hizo el truco para mí fue establecer explícitamente el XMLHttpRequest.responseType propiedad json en el objeto request. E. g,

    var request = new XMLHttpRequest();
    request.onreadystatechange = function() { ... }
    ...
    request.open('GET','https://random-domain.com/random-path',true);
    request.responseType = 'json';
    ...
    request.send();
  6. 0
    Browser --- request expects a given content-type ---> Server
            <-- response contains content-type ----------

    Firefox se ve en el HTTP Encabezado de Tipo de contenido.
    Si el servidor HTTP de respuesta de encabezado no coincide con las expectativas de su navegador de código que se quejan de que con este mensaje.

    Mi humilde opinión este mensaje de error podría haber sido mucho mejor, como «Esperando respuesta encabezado de Tipo de Contenido … pero encontré …».

  7. -6

    Kent, no estoy de acuerdo.

    La siguiente ES «válido» JSON:

    { a: 3 }

    Objeto de JavaScript nombres de propiedad NO tiene que ser cadenas.

    El problema es el tipo MIME, no JSON/la sintaxis de JavaScript.

    Me acaba de resolver esta cuestión mediante la adición de json como «text/javascript» a mi webserver de tipos mime del archivo:

    text/javascript                 js, json

    El «no bien formado» error desapareció. El navegador (FireFox) asume, erróneamente, que la .json archivo XML.

    • Mal. Es válido javascript, y si lo interpretamos como javascript, entonces va a estar bien. Howver, JSON es más estrictas de javascript, y el formato JSON se analiza seperatly por un cliente conforme a los estándares thant quiere «JSON» no «Javascript». Cualquier Specificiation compatible JSON parser trata sin comillas teclas como un error.
    • Para reiterar, JSON es un sublenguaje de javascript, y mientras que TODO JSON es válido javascript, NO todo el Javascript es válido JSON.
    • Si usted no está de acuerdo conmigo, tome su queja a Mozilla, como usted está sosteniendo su JSON parser está mal =). jsfiddle.net/kentnl/uGDQP
    • Tengo que decir que la exigencia de claves para tener «» es un alcalde falla en JSON. Es extra depresión, JS demuestra que no se requiere. Probablemente allí para acomodar analizador de escritores, y hay mucho menos analizador de escritores que hay usuarios. También siento el dolor de no ser capaz de pasar a las funciones, pero que al menos tiene sentido.
    • También el nombre de «JavaScript Object Notation» está desviando. No es la misma notación utilizada en Javascript.

Dejar respuesta

Please enter your comment!
Please enter your name here