"некорректная" ошибка в 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 перед вызовом "отправить", чтобы заставить его загружать как обычный текст, но это не сработало.

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

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

Ответ 1

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

application/json

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

Ответ 2

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

 { "a": 3 } 

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

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

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

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

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

Ответ 3

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

Ответ 4

Фактически это должно быть { "a": 3}.

Ответ 5

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

Ответ 6

Я также получал то же предупреждение с 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();

Ответ 7

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

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

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

Ответ 8

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

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

{ a: 3 }

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

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

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

text/javascript                 js, json

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