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

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

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

{ a: 3 }

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

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

Который вызывает следующую ошибку в консоли ошибок Firefox:

не хорошо сформирован
file://path/to/data.json Строка: 1
{а: 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, который можно использовать с простым текстом?

9 ответов

Решение

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

application/json

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

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

 { "a": 3 } 

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

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

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

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

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

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

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

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

Если нет особой причины открывать HTML-код прямо с диска ( file://), вы должны сделать себе одолжение и открыть его обслуживаемый локальным HTTP-сервером ( http://), как написал пользователь прототипа . Это решит эту проблему, поскольку тип MIME будет установлен правильно, как предложил jthompson .

Благодаря этому вы также не столкнетесь с другой проблемой, такой как « Причина: запрос CORS, а не HTTP », и, возможно, с другими, поскольку браузеры становятся все более и более подозрительными, когда их просят открыть файлы на локальном диске - и по уважительным причинам ( безопасность!).


Если в вашей системе установлен Python, то (возможно) самый простой способ запустить локальный HTTP-сервер :

Mac / Linux: python3 -m http.server

Окна: python -m http.server или py -3 -m http.server

Затем файлы из текущего рабочего каталога будут обслуживаться по адресу http: // localhost: 8000 /.


PS Если вы проголосуете за мой ответ, пожалуйста, проголосуйте также за другие полезные ответы, связанные мной. Спасибо! 😊

Я также получал то же предупреждение с 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();
Browser --- request expects a given content-type ---> Server
        <-- response contains content-type ----------

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

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

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

Следующее является "действительным" JSON:

{ a: 3 }

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

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

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

text/javascript                 js, json

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

Другие вопросы по тегам