Як отримати 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-адреси?


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? Тоді погляньте сюди . Але наступного разу спершу спробуй googling для помилки, посилання, яке я опублікував, - це перший результат, який з’являється при введенні помилки в Google.
Робін Хартманн

81

За допомогою Chrome, Firefox, Safari, Edge та Webview ви зможете використовувати API для завантаження, що робить це набагато простіше та набагато коротше.

Якщо вам потрібна підтримка IE або старіших браузерів, ви також можете скористатися програмою для отримання поліфону .

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

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

MDN: API отримання

Навіть незважаючи на те, що Node.js не має вбудованого методу, ви можете використовувати node-fetch, який дозволяє точно виконати цю реалізацію.


6
Цьфу .. це навіть не компілюється в IE11. Чому IE такі сміття?
Дано

4
Ви завжди можете використовувати поліфункцію github / fetch для подолання цієї проблеми.
DBrown

@dano - це функції стрілки. Використовуйте регулярні функції або Вавилон для трансляції
Філ

1
@ Дякую за вказівку на ES6. Найбільша проблема з IE11 полягає в тому, що збірка не підтримується API: developer.mozilla.org/en-US/docs/Web/API/Fetch_API Також слід знати, що поліфіл для отримання IE11, необхідний для IE11, суто ES5 (через відсутність підтримки), тому фактичної потреби в транспіляції ES6 немає, якщо ви абсолютно не потребуєте цього в іншому випадку. Якщо єдиною причиною його додати є підтримка ідіоми вибору (якщо поліфіл навіть підтримує її), кращим варіантом є використання babel-polyfill. Удачі!
DBrown

8

ES8 (2017) спробуйте

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

ви можете впоратися з помилками шляхом спроб лову


7

Axios - це 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
Зважаючи на те, що існує багато відповідей, будь ласка, зазначте, що щодо цієї відповіді варто додати до дискусії. Про використання результату згадувалося в кількох існуючих відповідях.
ToolmakerSteve

2
Це єдина відповідна відповідь у 2020 році. Це просто вибір, який потребує зворотного дзвінка, коли завершується асинхронна подія. Легко та елегантно
lesolorzanov

чому його fetchв цьому випадку не чекають? Я розгублений, я все ще бачу приклади, коли його чекають і називають просто
Пінчія,

0

цього ранку я також мав ті самі сумніви, і тепер я очистився, я щойно використав JSON з "відкритою картою погоди" ( https://openweathermap.org/ ) api та отримав дані з 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, тому що я мав безкоштовну підписку, просто маю безкоштовні підписки на початку. ви можете знайти кілька хороших безкоштовних програм і ключів на "rapidapi.com"


-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
це лише відповідь коду! додати деякі пояснення до допису
Рам Ghadiyaram

2
Зважаючи на те, що існує багато відповідей, будь ласка, зазначте, що щодо цієї відповіді варто додати до дискусії. Використання fetchзгадувалося в кількох існуючих відповідях.
ToolmakerSteve

-1

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

}


fetchDataAsync();


Опишіть, будь ласка, щось про свою відповідь.
Angel F Syrus

1
Зважаючи на те, що існує багато відповідей, будь ласка, зазначте, що щодо цієї відповіді варто додати до дискусії. Використання fetchзгадувалося в кількох існуючих відповідях. Використання await/asyncпри виборі, було описано у відповіді Каміля .
ToolmakerSteve
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.