Как получить JSON из URL в JavaScript?

166

Этот URL возвращает JSON:

{
  query: {
    count: 1,
    created: "2015-12-09T17:12:09Z",
    lang: "en-US",
    diagnostics: {},
    ...
  }
}

Я попробовал это, и это не сработало:

responseObj = readJsonFromUrl('http://query.yahooapis.com/v1/publ...');
var count = responseObj.query.count;

console.log(count) // should be 1

Как я могу получить объект JavaScript из ответа JSON этого URL?

Yiğit Doğuş Özçelik
источник
1
У вас есть URL-адрес, который возвращает ответ, содержащий строку JSON. Вы спрашиваете, как запросить что-то из URL? Потому что это во многом зависит от языка или инструмента, который вы используете. Более конкретно.
jrajav
1
Этот вопрос сбивает с толку. Разве вы не получаете объект JSON, используя указанный вами URL? Что вы подразумеваете под получением объекта JSON из URL? просьба уточнить.
Стивен

Ответы:

166

Вы можете использовать .getJSON()функцию jQuery :

$.getJSON('http://query.yahooapis.com/v1/public/yql?q=select%20%2a%20from%20yahoo.finance.quotes%20WHERE%20symbol%3D%27WRC%27&format=json&diagnostics=true&env=store://datatables.org/alltableswithkeys&callback', function(data) {
    // JSON result in `data` variable
});

Если вы не хотите использовать jQuery, вы должны посмотреть на этот ответ для чистого решения JS: https://stackoverflow.com/a/2499647/1361042

Дэн Барзилай
источник
14
Незначительный момент, но он мог бы быть более понятным, если бы в нем говорилось: «JSON находится в dataпеременной»
Натан Хорнби,
2
Вы указываете на чистый пример JavaScript для JSONP, который не будет работать с вопросом.
SArcher
137

Если вы хотите сделать это в простом javascript, вы можете определить функцию следующим образом:

var getJSON = function(url, callback) {
    var xhr = new XMLHttpRequest();
    xhr.open('GET', url, true);
    xhr.responseType = 'json';
    xhr.onload = function() {
      var status = xhr.status;
      if (status === 200) {
        callback(null, xhr.response);
      } else {
        callback(status, xhr.response);
      }
    };
    xhr.send();
};

И используйте это так:

getJSON('http://query.yahooapis.com/v1/public/yql?q=select%20%2a%20from%20yahoo.finance.quotes%20WHERE%20symbol%3D%27WRC%27&format=json&diagnostics=true&env=store://datatables.org/alltableswithkeys&callback',
function(err, data) {
  if (err !== null) {
    alert('Something went wrong: ' + err);
  } else {
    alert('Your query count: ' + data.query.count);
  }
});

Обратите внимание, что dataэто объект, поэтому вы можете получить доступ к его атрибутам, не анализируя его.

Робин Хартманн
источник
зачем использовать, .onload = function() {когда вы можете использовать, .onreadystatechange = function() { if (xhr.readState === 4) {я имею в виду, конечно, это короче, но вы жертвуете большой поддержкой для сохранения пары символов. Это не код-гольф
Downgoat
4
Это не только короче, но это также кажется немного более надежным в соответствии с этим постом . И caniuse.com говорит, что он поддерживается всем, кроме IE8, поэтому, пока вам не нужно поддерживать IE8, я не понимаю, почему вы не используете onload.
Робин Хартманн
@MikeySkullivan Я хотел бы знать одну вещь, почему я получаю responseText и responseXML как неопределенные, хотя статус ответа = 200?
Хруши
1
@hrushi Если они не определены, значит, вы обращаетесь к ним неправильно или в неверном контексте. Помните, что вы должны использовать xhr.responseText и xhr.responseXML, и они доступны только внутри блока определения функции getJSON, а не за его пределами.
Робин Хартманн
2
@MitchellD Вы используете Node.js? Тогда посмотрите сюда . Но в следующий раз, попробуйте сначала найти ошибку, ссылка, которую я разместил, является первым результатом, который появляется, когда я набираю ошибку в Google.
Робин Хартманн,
81

С помощью Chrome, Firefox, Safari, Edge и Webview вы можете использовать API извлечения, что значительно упрощает эту задачу и делает ее более лаконичной.

Если вам нужна поддержка IE или более старых браузеров, вы также можете использовать выборку polyfill .

let url = 'https://example.com';

fetch(url)
.then(res => res.json())
.then((out) => {
  console.log('Checkout this JSON! ', out);
})
.catch(err => { throw err });

MDN: Fetch API

Хотя Node.js не имеет этого встроенного метода, вы можете использовать node-fetch, который допускает точно такую ​​же реализацию.

DBrown
источник
6
Тьфу ... это даже не компилируется в IE11. Почему IE такой хлам?
Дано
4
Вы всегда можете использовать github / fetch polyfill для решения этой проблемы.
DBrown
@ Dano это функции стрелок. Используйте обычные функции или Вавилон, чтобы перенести
Фил
1
@Phil спасибо за указание на ES6. Самая большая проблема с IE11 заключается в том, что fetch не является поддерживаемым API: developer.mozilla.org/en-US/docs/Web/API/Fetch_API Также следует знать, что полифил выборки, необходимый для IE11, является чисто ES5 (из-за отсутствия поддержки), поэтому нет никакой необходимости в трансплантации ES6, если только вам это абсолютно не нужно. Если единственная причина его добавления - поддерживать идиому извлечения (если полифилл даже поддерживает его), лучше использовать babel-polyfill. Удачи!
DBrown
8

ES8 (2017) попробовать

obj = await (await fetch(url)).json();

вы можете обрабатывать ошибки путем try-catch

Камил Келчевски
источник
7

Вардар это обещание на основе HTTP - клиент для браузера и node.js .

Он предлагает автоматическое преобразование для данных JSON и является официальной рекомендацией команды Vue.js при переходе с версии 1.0, в которой по умолчанию включен клиент REST.

Выполнение GETзапроса

// Make a request for a user with a given ID
axios.get('http://query.yahooapis.com/v1/publ...')
  .then(function (response) {
    console.log(response);
  })
  .catch(function (error) {
    console.log(error);
  });

Или даже просто axios(url)достаточно, поскольку GETзапрос по умолчанию.

Эмиль Бержерон
источник
3

Определите функцию как:

fetchRestaurants(callback) {
    fetch(`http://www.restaurants.com`)
       .then(response => response.json())
       .then(json => callback(null, json.restaurants))
       .catch(error => callback(error, null))
}

Тогда используйте это так:

fetchRestaurants((error, restaurants) => {
    if (error) 
        console.log(error)
    else 
        console.log(restaurants[0])

});
Дэн Алботяну
источник
1
Учитывая, что существует много существующих ответов, пожалуйста, укажите, что из этого ответа стоит добавить к обсуждению. Использование fetch было упомянуто в нескольких существующих ответах.
ToolmakerSteve
2
Это единственный релевантный ответ в 2020 году. Это просто выборка, для которой требуется обратный вызов для завершения асинхронного события. Легко и элегантно
lesolorzanov
почему не fetchожидается в этом случае? Я в замешательстве, я продолжаю видеть примеры, когда это ожидается и
меня
0

Этим утром у меня тоже было такое же сомнение, и теперь, когда он исчез, я только что использовал JSON с api 'open-weather-map' ( https://openweathermap.org/ ) и получил данные из URL в файле index.html, код выглядит так:

 //got location
 var x = document.getElementById("demo");
      if (navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(weatherdata);
      } else { 
        x.innerHTML = "Geolocation is not supported by this browser.";
      }
    //fetch openweather map url with api key
    function weatherdata(position) {
//put corrdinates to get weather data of that location
      fetch('https://api.openweathermap.org/data/2.5/weather?lat='+position.coords.latitude+'&lon='+position.coords.longitude+'&appid=b2c336bb5abf01acc0bbb8947211fbc6')
      .then(response => response.json())
      .then(data => {
      console.log(data);
      document.getElementById("demo").innerHTML = 
      '<br>wind speed:-'+data.wind.speed + 
      '<br>humidity :-'+data.main.humidity + 
      '<br>temprature :-'+data.main.temp  
      });
    }
  <div id="demo"></div>

я дал ключ api открыто, потому что у меня была бесплатная подписка, просто в начале была бесплатная подписка. Вы можете найти хорошие бесплатные API и ключи на "rapidapi.com"

user12449933
источник
-1

Вы можете получить доступ к данным JSON с помощью fetch () в JavaScript

Обновите параметр url функции fetch () с помощью вашего URL.

fetch(url)
    .then(function(response){
        return response.json();
    })
    .then(function(data){
        console.log(data);
    })

Надеюсь, это помогает, это отлично сработало для меня.

Шиванш Шривастава
источник
2
Похоже, это дубликат ответа DBrown . Пожалуйста, не добавляйте повторяющиеся ответы. Если в этом ответе есть что-то уникальное, упомяните ответ DBrown и объясните, что отличается от вашего.
ToolmakerSteve
-1
//Resolved
const fetchPromise1 = fetch(url);
    fetchPromise1.then(response => {
      console.log(response);
    });


//Pending
const fetchPromise = fetch(url);
console.log(fetchPromise);
ашиш бандивар
источник
1
это только код ответ! добавить пояснение к посту
Рам Гадиярам
2
Учитывая, что существует много существующих ответов, пожалуйста, укажите, что из этого ответа стоит добавить к обсуждению. Использование fetchбыло упомянуто в нескольких существующих ответах.
ToolmakerSteve
-1

async function fetchDataAsync() {
    const response = await fetch('paste URL');
    console.log(await response.json())

}


fetchDataAsync();

ZQ-Йон
источник
Пожалуйста, опишите что-нибудь о своем ответе.
Angel F Syrus
1
Учитывая, что существует много существующих ответов, пожалуйста, укажите, что из этого ответа стоит добавить к обсуждению. Использование fetchбыло упомянуто в нескольких существующих ответах. Использование await/asyncс fetch, было описано в ответе Камиля .
ToolmakerSteve