«не правильно сформированная» ошибка в Firefox при загрузке файла JSON с XMLHttpRequest - PullRequest
65 голосов
/ 24 марта 2009

Я получаю «не правильно сформированную» ошибку в консоли ошибок Firefox 3.0.7, когда JavaScript на моей странице загружает текстовый файл, содержащий объект в формате нотации объектов JavaScript. Если файл не содержит ничего, кроме объекта JSON, он выдает ошибку. Если я оберну объект в теги , это не приведет к ошибке. Запрос выполняется в любом случае, поэтому я могу просто проигнорировать его, но я не хочу, чтобы мой журнал ошибок заполнялся этими сообщениями.

Вот пример кода для иллюстрации проблемы. Во-первых, «неправильно сформированный» файл с именем «data.json»:

{ a: 3 }

Теперь немного кода для загрузки файла:

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

Что приводит к следующей ошибке в консоли ошибок Firefox:

плохо сформирован
file: //path/to/data.json Строка: 1
{a: 3}
- ^

Если data.json изменен на это:

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

Нет ошибок. Я предположил, что это жалуется, потому что простой JSON-файл не является правильно сформированным XML-документом, поэтому я попытался переопределить тип MIME перед вызовом «send», чтобы заставить его загружаться как обычный текст, но это не сработало.

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

Я собираюсь продолжить упаковывать мои данные JSON в документ XML, чтобы обойти любую проверку, выполняемую XMLHttpRequest, но я хотел бы знать, есть ли способ заставить его просто загружать простой текст некритически и не пытайтесь проверить это. В качестве альтернативы, есть ли другой метод загрузки данных, кроме XMLHttpRequest, который можно использовать с обычным текстом?

Ответы [ 8 ]

69 голосов
/ 24 марта 2009

Вы пытались использовать MIME-тип для JSON?

application/json

Вы также можете настроить свой сервер на автоматическую отправку этого типа MIME для файлов .json.

20 голосов
/ 24 марта 2009

Во-первых, истинный JSON намного строже, чем JavaScript, и чтобы быть действительным JSON, вы должны заключить в кавычки свои ключи.

 { "a": 3 } 

Кроме того, поскольку вы используете пустой XMLHttpRequest, который обычно ожидает получения результата XML, если заголовки MIME не указывают строго иначе.

Однако вы можете захотеть сделать свою жизнь проще, просто используя среду JavaScript, такую ​​как jQuery, которая отвлечет вас от этой проблемы и решит все неприятные крайние случаи.

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

Кроме того, если вы используете как строгий JSON, так и библиотеку для его абстрагирования, когда браузеры начнут иметь собственные анализаторы JSON, библиотека сможет прозрачно использовать их и получить значительное улучшение скорости.

(Это должно произойти раньше, чем позже, и когда это произойдет, ваши пользователи получат автоматическое обновление без каких-либо усилий!).

5 голосов
/ 02 ноября 2010

Это также происходит, когда Content-Type полностью пуст (тем самым обходя естественное определение типа).

3 голосов
/ 09 апреля 2012

Я нашел то же сообщение об ошибке, но по совершенно другой причине. Через некоторое время, бесплодно изменив содержимое JSON, я понял, что случайно перезапустил страницу, работающую из локальной файловой системы (file: //Users/me/Sites/mypage.html), а не с сервера (http://localhost/~me/Sites/mypage.html).

)
3 голосов
/ 24 марта 2009

На самом деле это должно быть {"a": 3}.

1 голос
/ 21 сентября 2016

Я также получал то же предупреждение с XMLHttpRequest() (в FireFox), когда запрашивал ресурсы, помеченные сервером как Content-Type: application/json.

Что меня устроило, так это явным образом установив для свойства XMLHttpRequest.responseType значение json в объекте запроса. Например,

var request = new XMLHttpRequest();
request.onreadystatechange = function() { ... }
...
request.open('GET','https://random-domain.com/random-path',true);
request.responseType = 'json';
...
request.send();
0 голосов
/ 12 октября 2017
Browser --- request expects a given content-type ---> Server
        <-- response contains content-type ----------

Firefox просматривает заголовок HTTP Content-Type . Если заголовок HTTP-ответа сервера не соответствует ожиданиям кода вашего браузера, он будет жаловаться на это сообщение.

ИМХО, это сообщение об ошибке могло бы быть намного лучше, например, "Ожидается ответ заголовок типа содержимого ... но найден ...".

0 голосов
/ 24 ноября 2010

Кент, я не согласен.

Следующее IS"допустимый" JSON:

{ a: 3 }

Имена свойств объектов JavaScript НЕ обязательно должны быть строками.

Проблема в типе MIME, а не в синтаксисе JSON / JavaScript.

Я только что решил эту проблему, добавив json как "text / javascript" в файл типов mime моего веб-сервера:

text/javascript                 js, json

Ошибка "не правильно сформированная" исчезла. Браузер (FireFox) неверно предположил, что файл .json был XML.

...