Новые способы I: fetch
TL; DR Я бы рекомендовал этот способ, если вам не нужно отправлять синхронные запросы или поддерживать старые браузеры.
Если ваш запрос является асинхронным, вы можете использовать Fetch API для отправки HTTP-запросов. API-интерфейс fetch работает с обещаниями , что является хорошим способом обработки асинхронных рабочих процессов в JavaScript. При таком подходе вы используете fetch()
для отправки запроса и ResponseBody.json()
анализа ответа:
fetch(url)
.then(function(response) {
return response.json();
})
.then(function(jsonResponse) {
// do something with jsonResponse
});
Совместимость: Fetch API не поддерживается IE11, а также Edge 12 и 13. Однако есть полифилы .
Новые способы II: responseType
Как написал Лондерен в своем ответе , новые браузеры позволяют использовать responseType
свойство для определения ожидаемого формата ответа. Затем к проанализированным данным ответа можно получить доступ через response
свойство:
var req = new XMLHttpRequest();
req.responseType = 'json';
req.open('GET', url, true);
req.onload = function() {
var jsonResponse = req.response;
// do something with jsonResponse
};
req.send(null);
Совместимость: responseType = 'json'
не поддерживается IE11.
Классический способ
Стандартный XMLHttpRequest не имеет responseJSON
свойства, только responseText
и responseXML
. Пока bitly действительно отвечает некоторым JSON на ваш запрос, он responseText
должен содержать код JSON в виде текста, поэтому все, что вам нужно сделать, это проанализировать его с помощью JSON.parse()
:
var req = new XMLHttpRequest();
req.overrideMimeType("application/json");
req.open('GET', url, true);
req.onload = function() {
var jsonResponse = JSON.parse(req.responseText);
// do something with jsonResponse
};
req.send(null);
Совместимость: этот подход должен работать с любым браузером, который поддерживает XMLHttpRequest
и JSON
.
JSONHttpRequest
Если вы предпочитаете использовать responseJSON
, но хотите более легкое решение, чем JQuery, вы можете проверить мой JSONHttpRequest. Он работает точно так же, как обычный XMLHttpRequest, но также предоставляет responseJSON
свойство. Все, что вам нужно изменить в своем коде, это первая строка:
var req = new JSONHttpRequest();
JSONHttpRequest также предоставляет функциональные возможности для простой отправки объектов JavaScript в формате JSON. Более подробную информацию и код можно найти здесь: http://pixelsvsbytes.com/2011/12/teach-your-xmlhttprequest-some-json/ .
Полное раскрытие: я владелец Pixels | Bytes. Думаю, мой сценарий - хорошее решение проблемы, поэтому разместил его здесь. Пожалуйста, оставьте комментарий, если хотите, чтобы я удалил ссылку.
XMLHttpRequest
; о чем был вопрос.s a jquery version too. If you are getting crossbrowser issue
попробуем это, как правило , framework`s справиться с этими проблемами лучше: api.jquery.com/jquery.parsejsonfetch
- стандартный JavaScript.Вы можете просто установить
xhr.responseType = 'json';
Документация для responseType
источник
Примечание. Я тестировал это только в Chrome.
он добавляет функцию-прототип к XMLHttpRequest .. XHR2 ,
в XHR 1 вам, вероятно, просто нужно заменить
this.response
наthis.responseText
чтобы вернуть json в xhr2
РЕДАКТИРОВАТЬ
Если вы планируете использовать XHR с
arraybuffer
или другими типами ответов, вам необходимо проверить, является ли ответstring
.в любом случае вам нужно добавить больше проверок, например, если он не может проанализировать json.
источник
value
сget
в объекте передаетсяObject.defineProperty
, и вы можете использовать ,responseJSON
как и любой другой переменной отклика.Я думаю, вам нужно включить jQuery для использования
responseJSON
.Без jQuery вы можете попробовать responseText и попробовать
eval("("+req.responseText+")");
ОБНОВЛЕНИЕ : прочтите комментарий о том
eval
, что вы можете тестировать с помощью eval, но не используйте его в рабочем расширении.ИЛИ
используйте json_parse : он не использует
eval
источник
Используйте nsIJSON, если это для расширения FF:
Для веб-страницы просто используйте
JSON.parse
вместоComponents.classes["@mozilla.org/dom/json;1"].createInstance(Components.interfaces.nsIJSON.decode
источник