JavaScript'te URL'den JSON nasıl alınır?


166

Bu URL JSON döndürür:

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

Bunu denedim ve işe yaramadı:

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

console.log(count) // should be 1

Bu URL'nin JSON yanıtından nasıl bir JavaScript nesnesi alabilirim?


1
Sahip olduğunuz, JSON dizesi içeren bir yanıt döndüren bir URL'dir. Bir URL'den nasıl istekte bulunacağınızı mı soruyorsunuz? Çünkü bu, kullandığınız dile veya araca büyük ölçüde bağlı olacaktır. Daha spesifik ol.
jrajav

1
Bu soru kafa karıştırıcı. Bahsettiğiniz URL'yi kullanarak JSON nesnesini almıyor musunuz? Bir URL'den JSON nesnesini alarak ne demek istersiniz? lütfen açıkla.
Steven

Yanıtlar:


166

JQuery .getJSON()işlevini kullanabilirsiniz :

$.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 kullanmak istemiyorsanız, saf JS çözümü için şu cevaba bakmalısınız: https://stackoverflow.com/a/2499647/1361042


14
Küçük bir nokta ama 'JSON datadeğişkendir' yazıyorsa daha net olabilir
Nathan Hornby

2
İşaret ettiğiniz saf JavaScript örneği, soruyla çalışmayan JSONP içindir.
SArcher

137

Düz javascript ile yapmak istiyorsanız, aşağıdaki gibi bir işlev tanımlayabilirsiniz:

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

Ve şu şekilde kullanın:

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

Bunun databir nesne olduğunu unutmayın , böylece özniteliklerine ayrıştırmak zorunda kalmadan erişebilirsiniz.


neden kullanabileceğinizi .onload = function() {kullandığımdan .onreadystatechange = function() { if (xhr.readState === 4) {eminim, daha kısa ama birkaç karakteri kaydetmek için büyük bir destek feda ediyorsunuz. Bu kod golf değil
Downgoat

4
Sadece daha kısa değil, aynı zamanda bu yazıya göre biraz daha güvenilir görünüyor . Ve caniuse.com , IE8'i desteklemeniz gerekmediği sürece IE8 dışındaki her şey tarafından desteklendiğini söylüyor, neden onload'u kullanmayacağınızı görmüyorum.
Robin Hartmann

@MikeySkullivan Ben bir şey bilmek istedim, neden tepki durumu = 200 rağmen responseText ve responseXML tanımsız olarak alıyorum?
hrushi

1
@hrushi Tanımsızsa, onlara yanlış bir şekilde veya yanlış bağlamda erişiyorsunuzdur. Unutmayın, xhr.responseText ve xhr.responseXML kullanmanız gerekir ve bunlar yalnızca getJSON işlev tanımlama bloğunda kullanılabilir, bunun dışında değil.
Robin Hartmann

2
@MitchellD Node.js kullanıyor musunuz? O zaman buraya bir bakın . Ancak bir dahaki sefere hata için googling'i deneyin, yayınladığım bağlantı, hatayı Google'a yazdığımda ortaya çıkan ilk sonuçtur.
Robin Hartmann

81

Chrome, Firefox, Safari, Edge ve Webview ile getirme API'sını yerel olarak kullanabilirsiniz, bu da bunu çok daha kolay ve çok daha düzenli hale getirir.

IE veya daha eski tarayıcılar için desteğe ihtiyacınız varsa, çoklu doldurmayı da kullanabilirsiniz .

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

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

MDN: Getirme API'sı

Node.js'de bu yöntem yerleşik olmasa da, aynı uygulamaya izin veren düğüm getirme özelliğini kullanabilirsiniz .


6
Ugh .. bu IE11'de bile derlenmiyor. IE neden bu kadar önemsiz?
dano

4
Bu sorunun üstesinden gelmek için her zaman github / fetch çoklu dolgusunu kullanabilirsiniz.
DBrown

@dano bu ok işlevleri. Aktarmak için normal işlevleri veya Babil'i kullanın
Phil

1
@ ES6'yı işaret ettiğiniz için teşekkürler. IE11 ile ilgili en büyük sorun, getirmenin desteklenen bir API olmamasıdır: developer.mozilla.org/en-US/docs/Web/API/Fetch_API IE11 için gereken getirme çoklu dolgusunun tamamen ES5 olduğu da bilinmelidir (eksiklik nedeniyle) destek yoksa), aksi halde kesinlikle ihtiyacınız olmadığı sürece ES6 transpilasyonuna gerçek bir ihtiyaç yoktur. Eklemenin tek nedeni getirme deyimini desteklemekse (poli dolgu bile destekliyorsa), babel-polyfill kullanmak daha iyi bir seçenektir. İyi şanslar!
DBrown

8

ES8 (2017) deneyin

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

try-catch ile hataları halledebilirsiniz


7

Axios , tarayıcı ve node.js için söz tabanlı bir HTTP istemcisidir .

JSON verileri için otomatik dönüşümler sunar ve varsayılan olarak bir REST istemcisi içeren 1.0 sürümünden geçiş yaparken Vue.js ekibinin resmi önerisidir .

Bir GETistekte bulunma

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

Ya da axios(url)bir GETistek varsayılan olduğu için bile yeterlidir .


3

Şunun gibi bir işlev tanımlayın:

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

Sonra şu şekilde kullanın:

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

});

1
Mevcut birçok cevap olduğu düşünüldüğünde, lütfen bu cevap hakkında tartışmaya katmaya değer kıldığını belirtin. Bazı mevcut cevaplarda getirme kullanımından bahsedilmiştir.
ToolmakerSteve

2
Bu, 2020'deki tek ilgili cevaptır. Basitçe, eşzamansız bir etkinlik tamamlandığında geri arama gerektiren bir getiridir. Kolay ve zarif
lesolorzanov

neden fetchbu durumda beklenmiyor? Kafam karıştı, beklendiği ve açıkça çağrıldığı örnekleri görmeye devam ediyorum
Pynchia

0

Bu sabah, aynı şüphe vardı ve şimdi temizlendi ben sadece 'açık hava haritası' ( https://openweathermap.org/ ) api ile JSON kullanmış ve index.html dosyasındaki URL'den veri aldım, kod şöyle görünür: -

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

ücretsiz abonelik vardı, sadece başlangıçta ücretsiz abonelikler var çünkü ben açık bir şekilde api anahtarı vermek vardı. bazı iyi ücretsiz api ve anahtarları "rapidapi.com" da bulabilirsiniz


-1

JSON verilerine JavaScript'te fetch () yöntemini kullanarak erişebilirsiniz

Fetch () 'nin url parametresini url'nizle güncelleyin.

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

Umarım yardımcı olur, benim için mükemmel çalıştı.


2
Bu DBrown'un cevabının bir kopyası gibi görünüyor . Lütfen yinelenen cevaplar eklemeyin. Bu yanıtla ilgili benzersiz bir şey varsa, DBrown'un cevabından bahsedin ve kendiniz için neyin farklı olduğunu açıklayın.
ToolmakerSteve

-1
//Resolved
const fetchPromise1 = fetch(url);
    fetchPromise1.then(response => {
      console.log(response);
    });


//Pending
const fetchPromise = fetch(url);
console.log(fetchPromise);

1
Bu kod sadece cevap! mesaja biraz açıklama ekle
Ram Ghadiyaram

2
Mevcut birçok cevap olduğu düşünüldüğünde, lütfen bu cevap hakkında tartışmaya katmaya değer kıldığını belirtin. fetchBazı mevcut cevaplarda kullanımı belirtilmiştir.
ToolmakerSteve

-1

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

}


fetchDataAsync();


Lütfen cevabınız hakkında bir şeyler tanımlayın.
Angel F Syrus

1
Mevcut birçok cevap olduğu düşünüldüğünde, lütfen bu cevap hakkında tartışmaya katmaya değer kıldığını belirtin. fetchBazı mevcut cevaplarda kullanımı belirtilmiştir. Kullanımı await/asyncgetirme ile tarif edilmiştir Kamil'in cevap .
ToolmakerSteve
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.