Wie bekomme ich JSON von der URL in JavaScript?

166

Diese URL gibt JSON zurück:

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

Ich habe es versucht und es hat nicht funktioniert:

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

console.log(count) // should be 1

Wie kann ich ein JavaScript-Objekt aus der JSON-Antwort dieser URL abrufen?

Yiğit Doğuş Özçelik
quelle
1
Was Sie haben, ist eine URL, die eine Antwort zurückgibt, die eine JSON-Zeichenfolge enthält. Fragen Sie, wie Sie etwas von einer URL anfordern können? Denn das hängt stark von der Sprache oder dem Tool ab, das Sie verwenden. Sei genauer.
Jrajav
1
Diese Frage ist verwirrend. Erhalten Sie das JSON-Objekt nicht über die von Ihnen angegebene URL? Was meinen Sie mit dem Abrufen des JSON-Objekts von einer URL? Bitte klären Sie.
Steven

Antworten:

165

Sie können die jQuery- .getJSON()Funktion verwenden:

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

Wenn Sie jQuery nicht verwenden möchten, sollten Sie sich diese Antwort für eine reine JS-Lösung ansehen: https://stackoverflow.com/a/2499647/1361042

Dan Barzilay
quelle
14
Kleiner Punkt, könnte aber klarer sein, wenn darin angegeben ist, dass der JSON in der dataVariablen enthalten ist
Nathan Hornby,
2
Das reine JavaScript-Beispiel, auf das Sie verweisen, ist für JSONP, das mit der Frage nicht funktioniert.
SArcher
137

Wenn Sie dies in einfachem Javascript tun möchten, können Sie eine Funktion wie die folgende definieren:

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

Und benutze es so:

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

Beachten Sie, dass dies dataein Objekt ist, sodass Sie auf seine Attribute zugreifen können, ohne es analysieren zu müssen.

Robin Hartmann
quelle
Warum verwenden, .onload = function() {wenn Sie verwenden können? .onreadystatechange = function() { if (xhr.readState === 4) {Ich meine, es ist kürzer, aber Sie opfern viel Unterstützung für das Speichern einiger Zeichen. Dies ist kein Code-Golf
Downgoat
4
Es ist nicht nur kürzer, aber es scheint auch ein bisschen zuverlässiger nach zu diesem Beitrag . Und caniuse.com sagt, dass es von allem außer IE8 unterstützt wird. Solange Sie IE8 nicht unterstützen müssen, verstehe ich nicht, warum Sie Onload nicht verwenden würden.
Robin Hartmann
@MikeySkullivan Ich wollte eines wissen, warum erhalte ich responseText und responseXML als undefiniert, obwohl der Antwortstatus = 200 ist?
Hrushi
1
@hrushi Wenn sie nicht definiert sind, greifen Sie falsch oder im falschen Kontext darauf zu. Denken Sie daran, dass Sie xhr.responseText und xhr.responseXML verwenden müssen und diese nur innerhalb des Funktionsdefinitionsblocks getJSON verfügbar sind, nicht außerhalb.
Robin Hartmann
2
@MitchellD Verwenden Sie Node.js? Dann schauen Sie doch mal hier vorbei . Wenn Sie das nächste Mal versuchen, zuerst nach dem Fehler zu googeln, ist der von mir gepostete Link das erste Ergebnis, das angezeigt wird, wenn ich den Fehler in Google eingebe.
Robin Hartmann
81

Mit Chrome, Firefox, Safari, Edge und Webview können Sie die Abruf-API nativ verwenden, was dies viel einfacher und knapper macht.

Wenn Sie Unterstützung für IE oder ältere Browser benötigen, können Sie auch die Abruf-Polyfüllung verwenden .

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 abrufen

Obwohl in Node.js diese Methode nicht integriert ist, können Sie Node-Fetch verwenden , um genau dieselbe Implementierung zu ermöglichen.

DBrown
quelle
6
Ugh .. das wird nicht einmal in IE11 kompiliert. Warum ist IE so Müll?
Dano
4
Sie können jederzeit die Github / Fetch-Polyfüllung verwenden, um dieses Problem zu beheben.
DBrown
@dano es sind die Pfeilfunktionen. Verwenden Sie reguläre Funktionen oder Babel zum Transpilieren
Phil
1
@Phil danke für den Hinweis auf ES6. Das größte Problem mit IE11 ist, dass das Abrufen keine unterstützte API ist: developer.mozilla.org/en-US/docs/Web/API/Fetch_API Es sollte auch bekannt sein, dass die für IE11 erforderliche Abruf-Polyfüllung (aufgrund des Mangels) nur ES5 ist der Unterstützung), so dass keine tatsächliche Notwendigkeit für die ES6-Transpilation besteht, es sei denn, Sie benötigen sie unbedingt anderweitig. Wenn der einzige Grund für das Hinzufügen darin besteht, das Abruf-Idiom zu unterstützen (wenn die Polyfüllung es sogar unterstützt), ist die Verwendung von babel-polyfill eine bessere Option. Viel Glück!
DBrown
8

ES8 (2017) versuchen

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

Sie können Fehler durch Try-Catch behandeln

Kamil Kiełczewski
quelle
7

Axios ist ein Versprechen basiert HTTP - Client für den Browser und node.js .

Es bietet automatische Transformationen für JSON-Daten und ist die offizielle Empfehlung des Vue.js-Teams bei der Migration von der Version 1.0, die standardmäßig einen REST-Client enthält.

Durchführen einer GETAnfrage

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

Oder auch nur axios(url)genug, da eine GETAnfrage die Standardeinstellung ist.

Emile Bergeron
quelle
3

Definieren Sie eine Funktion wie:

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

Dann benutze es so:

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

});
Dan Alboteanu
quelle
1
Angesichts der Tatsache, dass es viele Antworten gibt, erwähnen Sie bitte, was es wert ist, zur Diskussion hinzugefügt zu werden. Die Verwendung von Fetch wurde in mehreren vorhandenen Antworten erwähnt.
ToolmakerSteve
2
Dies ist die einzige relevante Antwort im Jahr 2020. Es handelt sich lediglich um einen Abruf, für den ein Rückruf erforderlich ist, wenn ein asynchrones Ereignis abgeschlossen ist. Einfach und elegant
lesolorzanov
warum wird fetchin diesem Fall nicht erwartet? Ich bin verwirrt, ich sehe immer wieder Beispiele, wo es erwartet wird und klar genannt wird
Pynchia
0

Heute Morgen hatte ich auch den gleichen Zweifel und jetzt ist es klar, dass ich JSON gerade mit der API 'open-weather-map' ( https://openweathermap.org/ ) verwendet und Daten von der URL in der Datei index.html erhalten habe. Der Code sieht folgendermaßen aus:

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

Ich hatte offen API-Schlüssel geben, weil ich ein kostenloses Abonnement hatte, nur ein kostenloses Abonnement am Anfang. Unter "rapidapi.com" finden Sie einige gute kostenlose APIs und Schlüssel.

user12449933
quelle
-1

Sie können mit fetch () in JavaScript auf JSON-Daten zugreifen

Aktualisieren Sie den URL-Parameter von fetch () mit Ihrer URL.

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

Hoffe es hilft, es hat perfekt für mich funktioniert.

Shivansh Srivastava
quelle
2
Dies scheint ein Duplikat der Antwort von DBrown zu sein . Bitte fügen Sie keine doppelten Antworten hinzu. Wenn diese Antwort etwas Einzigartiges hat, erwähnen Sie die Antwort von DBrown und erklären Sie, was an Ihrer anders ist.
ToolmakerSteve
-1
//Resolved
const fetchPromise1 = fetch(url);
    fetchPromise1.then(response => {
      console.log(response);
    });


//Pending
const fetchPromise = fetch(url);
console.log(fetchPromise);
aschiges Bandiwar
quelle
1
Dies ist nur eine Antwort!
Fügen
2
Angesichts der Tatsache, dass es viele Antworten gibt, erwähnen Sie bitte, was es wert ist, zur Diskussion hinzugefügt zu werden. Die Verwendung von fetchwurde in mehreren bestehenden Antworten erwähnt.
ToolmakerSteve
-1

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

}


fetchDataAsync();

zq-jhon
quelle
Bitte beschreiben Sie etwas über Ihre Antwort.
Angel F Syrus
1
Angesichts der Tatsache, dass es viele Antworten gibt, erwähnen Sie bitte, was es wert ist, zur Diskussion hinzugefügt zu werden. Die Verwendung von fetchwurde in mehreren bestehenden Antworten erwähnt. Die Verwendung von await/asyncmit holen wurde in Kamils ​​Antwort beschrieben .
ToolmakerSteve