некорректная ошибка в Firefox при загрузке файла JSON с помощью XMLHttpRequest

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

Вот пример кода, иллюстрирующий проблему. Во-первых, «некорректный» файл с именем «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, который можно использовать с обычным текстом?


person A. Levy    schedule 24.03.2009    source источник


Ответы (8)


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

application/json

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

person jthompson    schedule 24.03.2009
comment
Чтобы быть более конкретным: req.overrideMimeType (application / json); req.send (ноль); работает. Указание типа MIME на сервере было бы лучшим решением, но его переопределение тоже работает. - person A. Levy; 24.03.2009
comment
Где это должно быть размещено? В файле JSON? - person CodyBugstein; 05.11.2014
comment
Возможно ли такое решение при разработке на локальном уровне? - person MisterJ; 12.05.2015

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

 { "a": 3 } 

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

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

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

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

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

person Kent Fredric    schedule 24.03.2009
comment
Спасибо за указатели на JSON. Я изменю свои данные, чтобы использовать имена строковых атрибутов в кавычках. К сожалению, jQuery или какой-либо другой фреймворк для меня не вариант. - person A. Levy; 24.03.2009
comment
Меня больше всего интересовало бы, почему, как правило, это признак зловония кода, чтобы яростно избегать повторного использования кода и избегать использования решенных проблем. - person Kent Fredric; 24.03.2009
comment
@Kent, я был бы рад использовать jQuery. Однако процесс утверждения использования jQuery чрезмерно сложен. Время, которое потребуется, чтобы спорить с заказчиком и продемонстрировать, что нам нужно использовать jQuery, не окупается. Печально, но факт. - person A. Levy; 13.05.2009
comment
@A. Леви: ты научишься, и в следующий раз у тебя будет меньше шансов вручную кодировать все :) - person Kent Fredric; 14.05.2009
comment
использование $.getJSON() по-прежнему вызывает у меня это сообщение об ошибке. - person shoosh; 26.01.2011
comment
@Shoosh, вы правильно кодируете свои данные? Как указано, вы ДОЛЖНЫ кодировать ключи и значения соответствующим образом, см. jsfiddle.net/ kentnl / uGDQP / 1 для примеров. - person Kent Fredric; 06.02.2011

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

person Dustin Oprea    schedule 02.11.2010

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

person Julian Aubourg    schedule 24.03.2009

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

person prototype    schedule 09.04.2012

Я также получал такое же предупреждающее сообщение с 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();
person focorner    schedule 20.09.2016

Browser --- request expects a given content-type ---> Server
        <-- response contains content-type ----------

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

IMHO это сообщение об ошибке могло быть намного лучше, например «Ожидание ответа Content-Type header ... но найдено ...».

person Christophe Roussy    schedule 12.10.2017

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

Следующий ЯВЛЯЕТСЯ "действительным" JSON:

{ a: 3 }

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

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

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

text/javascript                 js, json

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

person Rhino    schedule 24.11.2010
comment
Неправильный. Это действительный javascript, и если вы интерпретируете его как javascript, то все будет в порядке. Однако JSON строже, чем javascript, а формат JSON анализируется отдельно соответствующим клиентом, который не хочет, чтобы JSON, а не Javascript. Любой синтаксический анализатор JSON, совместимый со спецификацией, рассматривает ключи без кавычек как ошибку. - person Kent Fredric; 04.02.2011
comment
Повторюсь, JSON - это подъязык javascript, и хотя ВСЕ JSON является допустимым javascript, НЕ весь Javascript является допустимым JSON. - person Kent Fredric; 04.02.2011
comment
Если вы не согласны со мной, отнесите свою жалобу в Mozilla, поскольку вы утверждаете, что их парсер JSON ошибочен =). jsfiddle.net/kentnl/uGDQP - person Kent Fredric; 06.02.2011
comment
Я должен сказать, что требование наличия ключей - это недостаток JSON. Это лишний спад, JS доказывает, что в этом нет необходимости. Вероятно, он предназначен для размещения авторов синтаксических анализаторов, а авторов синтаксических анализаторов гораздо меньше, чем пользователей. Я также сожалею о том, что не могу передавать функции, но, по крайней мере, это имеет смысл. - person Lodewijk; 01.11.2013
comment
Также вводит в заблуждение название JavaScript Object Notation. Это не те обозначения, которые используются в Javascript. - person Lodewijk; 01.11.2013