2009-03-24 6 views
61

Otrzymuję komunikat "nie jest dobrze sformułowany" w konsoli błędów Firefoksa 3.0.7, gdy JavaScript na mojej stronie ładuje plik tekstowy zawierający obiekt w formacie JavaScript Object Notation. Jeśli plik zawiera tylko obiekt JSON, generuje błąd. Jeśli zawijam obiekt w tagach <dokument> </document > to nie spowoduje to błędu. Żądanie powiodło się w każdy sposób, więc mogłem go zignorować, ale nie chcę, aby mój dziennik błędów zapełniał się tymi wiadomościami.Błąd "źle sformułowany" w Firefoksie podczas ładowania pliku JSON za pomocą XMLHttpRequest

Oto przykładowy kod ilustrujący problem. Po pierwsze, „nie jest dobrze uformowane” plik o nazwie „data.json”:

{ a: 3 } 

Teraz trochę kodu do załadowania pliku:

która produkuje następujący błąd w konsoli błędów Firefox:

nie jest dobrze uformowane
plik: Linia //path/to/data.json 1
{a: 3}
-^

Jeśli data.json jest modyfikowany do tego:

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

nie ma błędu. Zakładam, że narzeka, ponieważ zwykły plik JSON nie jest dobrze sformatowanym dokumentem XML, więc próbowałem przesłonić typ MIME przed wywołaniem "wyślij", aby wymusić załadowanie go jako zwykły tekst, ale to nie zadziałało.

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

mam zamiar kontynuować owijanie moich danych JSON w dokumencie XML, aby ominąć niezależnie od poprawności XMLHttpRequest wykonuje, ale chciałbym wiedzieć, czy istnieje jakiś sposób mogę zmusić go po prostu załadować zwykły tekst bezkrytycznie i nie próbuj go potwierdzać. Czy istnieje inny sposób ładowania danych poza XMLHttpRequest, który może być użyty z czystym tekstem?

Odpowiedz

64

Czy próbowałeś używać typu MIME dla JSON?

application/json 

Można również skonfigurować serwer, aby automatycznie wysyłać ten typ MIME dla plików .json.

+0

To działa, dziękuję! –

+7

Aby być dokładniejszym: req.overrideMimeType ("application/json"); req.send (null); działa. Określenie typu MIME na serwerze byłoby lepszym rozwiązaniem, ale nadpisywanie również działa. –

+0

To jest świetne! Mi to pasuje. Dzięki! – shaosh

20

Po pierwsze, prawdziwy JSON jest znacznie bardziej rygorystyczny niż JavaScript, a aby zachować ważność JSON, trzeba podać klucze.

{ "a": 3 } 

Ponadto, jak używasz gołe XMLHttpRequest, która generalnie spodziewa się otrzymać wynik XML chyba nagłówki MIME ściśle określić inaczej.

Możesz jednak chcieć ułatwić sobie życie, korzystając ze struktury JavaScript, takiej jak jQuery, która rozwiąże wszystkie problemy i rozwiąże wszystkie nieprzyjemne przypadki.

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

Dodatkowo, jeśli używać zarówno ścisłe JSON i użyć biblioteki do abstrakcyjny to dla ciebie, gdy przeglądarek rozpocząć o natywnej JSON parserami biblioteka będzie mógł transparentnie skorzystać z nich i uzyskać znaczną poprawę prędkości.

(Jest to planowane wcześniej niż później, a kiedy to się stanie, użytkownicy otrzymają cichą aktualizację bez wysiłku!).

+0

Dzięki za wskazówki na JSON. Zmienię moje dane, aby używać cytowanych nazw atrybutów ciągów. Niestety, jQuery lub inna struktura nie jest dla mnie opcją. –

+0

Byłbym najbardziej zainteresowany dlaczego, ogólnie jest to oznaka smrodu kodu, aby gwałtownie unikać ponownego użycia kodu i aby uniknąć używania rozwiązanych problemów. –

+1

to powinna być prawdziwa odpowiedź ... – TheHippo

3

Powinno to być {"a": 3}.

5

Zjawisko to występuje również, gdy Content-Type jest całkowicie pusty (przez co omija naturalne wykrywanie typu).

-6

Kent, nie zgadzam się.

Poniższy JEST "ważna" JSON:

{ a: 3 } 

JavaScript nazwy właściwości obiektu nie muszą być łańcuchami.

Problem jest jednym z typów MIME, a nie JSON/JavaScript.

właśnie rozwiązał ten problem poprzez dodanie bardzo json jako "text/javascript" do moich typów MIME webserver pliku:

text/javascript     js, json 

"not dobrze uformowane" błąd zniknął. Przeglądarka (FireFox) założyła, niepoprawnie, że plik .json był XML.

+8

Niepoprawnie. To jest poprawne * javascript *, a jeśli zinterpretujesz to jako javascript, to będzie dobrze. Howver, JSON jest * bardziej rygorystyczny * niż javascript, a format JSON jest przetwarzany osobno przez zgodnego klienta, który chce "JSON", a nie "Javascript". Dowolny parser JSON zgodny ze specyfikacjami traktuje niecytowane klucze jako błąd. –

+1

Powtórzmy, JSON jest * podrzędnym * javascriptem, a podczas gdy * ALL * JSON jest poprawnym javascript, ** NOT ** all Javascript jest poprawnym JSON. –

+1

Jeśli nie zgadzasz się ze mną, zanieś skargę do Mozilli, ponieważ argumentujesz, że ich parser JSON jest nieprawidłowy =). http://jsfiddle.net/kentnl/uGDQP/ –

1

Znalazłem ten sam komunikat o błędzie, ale z zupełnie innej przyczyny. Po pewnym czasie bezowocnej zmiany zawartości JSON, zdałem sobie sprawę, że przypadkowo zrestartowałem stronę uruchamiającą się z lokalnego systemu plików (file: //Users/me/Sites/mypage.html) zamiast serwera (http: // localhost/~ me/Sites/mypage.html).

0

Otrzymałem również ten sam komunikat ostrzegawczy z XMLHttpRequest() (w FireFox), podczas żądania zasobów oznaczonych przez serwer jako oznaczone jako Content-Type: application/json.

Co mi dolega, to jawnie ustawić właściwość XMLHttpRequest.responseType na json w obiekcie żądania. Na przykład,

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

Firefox patrzy na HTTP Content-Type header. Jeśli nagłówek odpowiedzi HTTP serwera nie jest zgodny z oczekiwaniami kodu przeglądarki, będzie on zgłaszał ten komunikat.

IMHO ten komunikat o błędzie mógł być znacznie lepszy, na przykład "Oczekiwano odpowiedzi Content-Type header ... but found ...".

Powiązane problemy