Как загрузить JSON-файл в Javascript [дубликат]

в файле манифеста устанавливает второе действие parentActivityName как первое действие и удаляет параметр screenOrientation во второе действие. это означает, что ваша первая деятельность является родителем и решит ориентацию вашего второго занятия.

<activity
        android:name=".view.FirstActiviy"
        android:screenOrientation="portrait"
        android:theme="@style/AppTheme" />

<activity
        android:name=".view.SecondActivity"
        android:parentActivityName=".view.FirstActiviy"
        android:theme="@style/AppTheme.Transparent" />
63
задан FruitBreak 27 February 2013 в 11:26
поделиться

5 ответов

Новые способы 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
  });

Совместимость: API-интерфейс Fetch не поддерживается IE11, а также Edge 12 & amp ; 13. Однако существуют полиполны .

Новые способы II: responseType

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

169
ответ дан Torben 24 August 2018 в 02:58
поделиться

Используйте nsIJSON , если это для расширения FF:

var req = new XMLHttpRequest;
req.overrideMimeType("application/json");
req.open('GET', BITLY_CREATE_API + encodeURIComponent(url) + BITLY_API_LOGIN, true);
var target = this;
req.onload = function() {target.parseJSON(req, url)};
req.send(null);

parseJSON: function(req, url) {
if (req.status == 200) {
  var jsonResponse = Components.classes["@mozilla.org/dom/json;1"]
      .createInstance(Components.interfaces.nsIJSON.decode(req.responseText);
  var bitlyUrl = jsonResponse.results[url].shortUrl;
}

Для веб-страницы просто используйте JSON.parse вместо Components.classes["@mozilla.org/dom/json;1"].createInstance(Components.interfaces.nsIJSON.decode

0
ответ дан erikvold 24 August 2018 в 02:58
поделиться

Примечание: я тестировал это только в Chrome.

добавляет функцию прототипа в XMLHttpRequest .. XHR2,

в XHR 1, вам, вероятно, просто нужно заменить this.response с this.responseText

Object.defineProperty(XMLHttpRequest.prototype,'responseJSON',{value:function(){
 return JSON.parse(this.response);
},writable:false,enumerable:false});

, чтобы вернуть json в xhr2

xhr.onload=function(){
 console.log(this.responseJSON());
}

EDIT

Если вы планируете использовать XHR с arraybuffer или другие типы ответов, тогда вы должны проверить, является ли ответ string.

в любом случае вам нужно добавить дополнительные проверки, например если он не может разобрать json.

Object.defineProperty(XMLHttpRequest.prototype,'responseJSON',{value:function(){
 return (typeof this.response==='string'?JSON.parse(this.response):this.response);
},writable:false,enumerable:false});
2
ответ дан Lachlan Goodhew-Cook 24 August 2018 в 02:58
поделиться

Вы можете просто установить xhr.responseType = 'json';

const xhr = new XMLHttpRequest();
xhr.open('GET', 'https://jsonplaceholder.typicode.com/posts/1');
xhr.responseType = 'json';
xhr.onload = function(e) {
  if (this.status == 200) {
    console.log('response', this.response); // JSON response  
  }
};
xhr.send();
  

Документация для responseType

8
ответ дан Londeren 24 August 2018 в 02:58
поделиться

Я думаю, вы должны включить jQuery для использования responseJSON.

Без jQuery вы можете попробовать с responseText и попробовать, как eval("("+req.responseText+")");

UPDATE: Пожалуйста, прочитайте комментарий относительно eval, вы можете протестировать с помощью eval, но не использовать его в рабочем расширении.

ИЛИ

использовать json_parse : он не использует eval

2
ответ дан YOU 24 August 2018 в 02:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: