Bagaimana cara mendapatkan JSON dari URL dalam JavaScript?

166

URL ini mengembalikan JSON:

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

Saya mencoba ini, dan itu tidak berhasil:

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

console.log(count) // should be 1

Bagaimana saya bisa mendapatkan objek JavaScript dari respons JSON URL ini?

Yiğit Doğuş Özçelik
sumber
1
Apa yang Anda miliki adalah URL yang mengembalikan respons yang berisi string JSON. Apakah Anda bertanya bagaimana cara meminta sesuatu dari URL? Karena itu akan sangat tergantung pada bahasa atau alat yang Anda gunakan. Lebih spesifik.
jrajav
1
Pertanyaan ini membingungkan. Apakah Anda tidak mendapatkan objek JSON dengan menggunakan URL yang Anda sebutkan? Apa yang Anda maksud dengan mendapatkan objek JSON dari URL? mohon klarifikasi.
Steven

Jawaban:

165

Anda dapat menggunakan .getJSON()fungsi 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
});

Jika Anda tidak ingin menggunakan jQuery, Anda harus melihat jawaban ini untuk solusi JS murni: https://stackoverflow.com/a/2499647/1361042

Dan Barzilay
sumber
14
Poin minor tetapi mungkin lebih jelas jika menyatakan 'JSON ada dalam datavariabel'
Nathan Hornby
2
Contoh JavaScript murni yang Anda tunjukkan adalah untuk JSONP, yang tidak akan berfungsi dengan pertanyaan.
Sarcher
137

Jika Anda ingin melakukannya dalam javascript biasa, Anda dapat mendefinisikan fungsi seperti ini:

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();
};

Dan gunakan seperti ini:

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);
  }
});

Perhatikan bahwa itu dataadalah objek, sehingga Anda dapat mengakses atributnya tanpa harus menguraikannya.

Robin Hartmann
sumber
mengapa menggunakan .onload = function() {ketika Anda dapat menggunakan .onreadystatechange = function() { if (xhr.readState === 4) {maksud saya tentu saja, ini lebih pendek tetapi Anda mengorbankan banyak dukungan untuk menyelamatkan beberapa karakter. Ini bukan kode-golf
Downgoat
4
Ini tidak hanya lebih pendek, tetapi juga agak lebih andal menurut pos ini . Dan caniuse.com mengatakan itu didukung oleh segalanya kecuali IE8, jadi selama Anda tidak perlu mendukung IE8, saya tidak melihat mengapa Anda tidak akan menggunakan onload.
Robin Hartmann
@MikeySkullivan Saya ingin tahu satu hal, mengapa saya mendapatkan responseText dan responseXML sebagai tidak terdefinisi meskipun status respon = 200?
hrushi
1
@hrushi Jika tidak ditentukan, Anda mengaksesnya dengan cara yang salah atau dalam konteks yang salah. Ingat, Anda harus menggunakan xhr.responseText dan xhr.responseXML dan mereka hanya tersedia di dalam blok definisi fungsi getJSON, bukan di luarnya.
Robin Hartmann
2
@MitchellD Apakah Anda menggunakan Node.js? Kemudian lihat di sini . Tapi lain kali coba googling untuk kesalahan dulu, tautan yang saya posting adalah hasil pertama yang muncul ketika saya mengetik kesalahan ke Google.
Robin Hartmann
81

Dengan Chrome, Firefox, Safari, Edge, dan Webview Anda dapat menggunakan fetch API asli yang membuatnya lebih mudah, dan jauh lebih singkat.

Jika Anda memerlukan dukungan untuk IE atau browser lama, Anda juga dapat menggunakan fetch 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: Ambil API

Meskipun Node.js tidak memiliki metode ini built-in, Anda dapat menggunakan node-fetch yang memungkinkan untuk implementasi yang sama persis.

DBrown
sumber
6
Ugh .. ini bahkan tidak bisa dikompilasi di IE11. Mengapa IE sampah seperti itu?
dano
4
Anda selalu dapat menggunakan polyfill github / fetch untuk mengatasi masalah ini.
DBrown
@ apakah itu fungsi panah. Gunakan fungsi biasa atau Babel untuk mengubah
Phil
1
@ Phil terima kasih telah menunjukkan ES6. Masalah terbesar dengan IE11 adalah bahwa mengambil bukan API yang didukung: developer.mozilla.org/en-US/docs/Web/API/Fetch_API Perlu juga diketahui bahwa pengambilan polyfill yang diperlukan untuk IE11 adalah murni ES5 (karena kekurangan dukungan), jadi tidak ada kebutuhan aktual untuk transpilasi ES6 kecuali Anda benar-benar membutuhkannya. Jika satu-satunya alasan untuk menambahkannya adalah untuk mendukung idiom pengambilan (jika polyfill bahkan mendukungnya), menggunakan babel-polyfill adalah pilihan yang lebih baik. Semoga berhasil!
DBrown
8

ES8 (2017) coba

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

Anda dapat menangani kesalahan dengan coba-coba

Kamil Kiełczewski
sumber
7

Axios adalah klien HTTP berdasarkan janji untuk browser dan node.js .

Ini menawarkan transformasi otomatis untuk data JSON dan itu adalah rekomendasi resmi dari tim Vue.js ketika bermigrasi dari versi 1.0 yang menyertakan klien REST secara default.

Melakukan GETpermintaan

// 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);
  });

Atau bahkan axios(url)sudah cukup karena GETpermintaan adalah default.

Emile Bergeron
sumber
3

Tentukan fungsi seperti:

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

Kemudian gunakan seperti ini:

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

});
Dan Alboteanu
sumber
1
Mengingat bahwa ada banyak jawaban yang ada, tolong sebutkan bagaimana dengan jawaban ini membuatnya layak ditambahkan ke diskusi. Penggunaan pengambilan telah disebutkan dalam beberapa jawaban yang ada.
ToolmakerSteve
2
Ini adalah satu-satunya jawaban yang relevan di tahun 2020. Ini hanyalah pengambilan yang membutuhkan panggilan balik untuk saat acara asinkron selesai. Mudah dan elegan
lesolorzanov
mengapa tidak fetchditunggu dalam kasus ini? Saya bingung, saya terus melihat contoh di mana itu ditunggu dan dipanggil dengan jelas
Pynchia
0

pagi ini, saya juga memiliki keraguan yang sama dan sekarang sudah dibersihkan saya baru saja menggunakan JSON dengan 'open-weather-map' ( https://openweathermap.org/ ) api dan mendapatkan data dari URL di file index.html, kode terlihat seperti ini: -

 //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>

Saya telah memberikan kunci api secara terbuka karena saya memiliki langganan gratis, hanya memiliki langganan gratis di awal. Anda dapat menemukan api dan kunci gratis yang bagus di "rapidapi.com"

pengguna12449933
sumber
-1

Anda dapat mengakses data JSON dengan menggunakan fetch () di JavaScript

Perbarui parameter url ambil () dengan url Anda.

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

Semoga ini bisa membantu, itu bekerja dengan baik untuk saya.

Shivansh Srivastava
sumber
2
Ini tampaknya merupakan duplikat dari jawaban DBrown . Tolong jangan tambahkan jawaban duplikat. Jika ada sesuatu yang unik tentang jawaban ini, maka sebutkan jawaban DBrown, dan jelaskan apa yang berbeda tentang jawaban Anda.
ToolmakerSteve
-1
//Resolved
const fetchPromise1 = fetch(url);
    fetchPromise1.then(response => {
      console.log(response);
    });


//Pending
const fetchPromise = fetch(url);
console.log(fetchPromise);
bandiwar ashish
sumber
1
ini hanya kode jawaban! tambahkan beberapa penjelasan ke posting
Ram Ghadiyaram
2
Mengingat bahwa ada banyak jawaban yang ada, tolong sebutkan bagaimana dengan jawaban ini membuatnya layak ditambahkan ke diskusi. Penggunaan fetchtelah disebutkan dalam beberapa jawaban yang ada.
ToolmakerSteve
-1

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

}


fetchDataAsync();

zq-jhon
sumber
Tolong jelaskan sesuatu tentang jawaban Anda.
Angel F Syrus
1
Mengingat bahwa ada banyak jawaban yang ada, tolong sebutkan bagaimana dengan jawaban ini membuatnya layak ditambahkan ke diskusi. Penggunaan fetchtelah disebutkan dalam beberapa jawaban yang ada. Penggunaan await/asyncdengan mengambil, dijelaskan dalam jawaban Kamil .
ToolmakerSteve