Errore “non ben formato” in Firefox durante il caricamento del file JSON con XMLHttpRequest

Ricevo un errore “non ben formato” nella console degli errori di Firefox 3.0.7 quando il JavaScript nella mia pagina carica un file di testo contenente un object nel formato JavaScript Notazione object. Se il file non contiene altro che l’object JSON, produce l’errore. Se avvolgo l’object nei tag non produce l’errore. La richiesta ha esito positivo in entrambi i casi, quindi potrei semplicemente ignorarla, ma non voglio che il mio log degli errori si riempia di questi messaggi.

Ecco alcuni esempi di codice per illustrare il problema. Innanzitutto, il file “non ben formato” chiamato “data.json”:

{ a: 3 } 

Ora un po ‘di codice per caricare il file:

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

Che produce il seguente errore nella console degli errori di Firefox:

non ben formato
file: //path/to/data.json Line: 1
{a: 3}
– ^

Se data.json viene modificato in questo modo:

 { a: 3 } 

Non c’è errore Presumo che si stia lamentando perché il semplice file JSON non è un documento XML ben formato, quindi ho provato a sovrascrivere il tipo MIME prima della chiamata “send” per forzare il caricamento come testo normale, ma non ha funzionato.

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

Ho intenzione di continuare con il wrapping dei miei dati JSON in un documento XML per aggirare qualsiasi convalida che XMLHttpRequest sta eseguendo, ma mi piacerebbe sapere se c’è un modo in cui posso forzare il caricamento di testo normale in modo acritico e non provare a convalidarlo. In alternativa, esiste un altro metodo di caricamento dei dati oltre a XMLHttpRequest che può essere utilizzato con testo normale?

Hai provato a utilizzare il tipo MIME per JSON?

 application/json 

È anche ansible configurare il server per l’invio automatico di questo tipo MIME per i file .json.

In primo luogo, il vero JSON è molto più severo di JavaScript e, per essere JSON valido, devi avere le tue chiavi quotate.

  { "a": 3 } 

Inoltre, poiché si utilizza un XMLHttpRequest, che generalmente si aspetta di ricevere un risultato XML, a meno che le intestazioni MIME non specificino rigorosamente altrimenti.

Puoi comunque desiderare di semplificarti la vita semplicemente usando un framework JavaScript come jQuery che risolverà tutto questo problema per te e gestirà tutti i casi di brutto limite.

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

Inoltre, se si utilizza sia il JSON rigoroso che una libreria per estrarlo automaticamente, quando i browser iniziano ad avere parser JSON nativi, la libreria sarà in grado di utilizzarli in modo trasparente e ottenere un significativo miglioramento della velocità.

(Questo è previsto per accadere prima ansible, e quando ciò accadrà, i tuoi utenti otterranno un aggiornamento silenzioso senza alcuno sforzo!).

Ciò si verifica anche quando Content-Type è completamente vuoto (eludendo in tal modo il rilevamento naturale del tipo).

Dovrebbe essere {“a”: 3} in realtà.

Ho trovato lo stesso messaggio di errore ma da una causa molto diversa. Dopo un po ‘di tempo modificando infruttuosamente il contenuto JSON, mi resi conto che avevo accidentalmente riavviato la pagina scappando dal file system locale (file: //Users/me/Sites/mypage.html) piuttosto che dal server (http: // localhost / ~ me / Siti / mypage.html).

Stavo ricevendo lo stesso messaggio di avviso con XMLHttpRequest() (in FireFox), quando richiedevo le risorse contrassegnate come Content-Type: application/json dal server.

Il trucco per me è stato quello di impostare esplicitamente la proprietà XMLHttpRequest.responseType su json sull’object richiesta. Per esempio,

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

Firefox esamina l' intestazione Content-Type HTTP. Se l'intestazione della risposta HTTP del server non corrisponde alle aspettative del tuo codice del browser, si lamenterà con questo messaggio.

IMHO questo messaggio di errore avrebbe potuto essere molto meglio, come "Aspettando la risposta Content-Type header ... ma trovato ...".

Kent, non sono d’accordo.

Il seguente IS JSON “valido”:

 { a: 3 } 

I nomi delle proprietà degli oggetti JavaScript NON devono essere stringhe.

Il problema è di tipo MIME, non di syntax JSON / JavaScript.

Ho appena risolto questo problema aggiungendo json come “text / javascript” al mio file dei tipi mime del server web:

 text/javascript js, json 

L’errore “non ben formato” è scomparso. Il browser (FireFox) presupponeva, erroneamente, che il file .json fosse XML.