Comment obtenir JSON à partir d'une URL en JavaScript?

166

Cette URL renvoie JSON:

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

J'ai essayé ceci, et cela n'a pas fonctionné:

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

console.log(count) // should be 1

Comment puis-je obtenir un objet JavaScript à partir de la réponse JSON de cette URL?

Yiğit Doğuş Özçelik
la source
1
Ce que vous avez est une URL qui renvoie une réponse contenant une chaîne JSON. Demandez-vous comment demander quelque chose à partir d'une URL? Parce que cela dépendrait beaucoup du langage ou de l'outil que vous utilisez. Sois plus précis.
jrajav
1
Cette question prête à confusion. N'obtenez-vous pas l'objet JSON en utilisant l'URL que vous avez mentionnée? Qu'entendez-vous par obtenir l'objet JSON à partir d'une URL? précisez s'il vous plaît.
Steven le

Réponses:

166

Vous pouvez utiliser la .getJSON()fonction 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
});

Si vous ne souhaitez pas utiliser jQuery, vous devriez regarder cette réponse pour une solution JS pure: https://stackoverflow.com/a/2499647/1361042

Dan Barzilay
la source
14
Point mineur mais pourrait être plus clair s'il indiquait `` Le JSON est dans la datavariable ''
Nathan Hornby
2
L'exemple JavaScript pur que vous pointez concerne JSONP, qui ne fonctionnera pas avec la question.
SArcher
137

Si vous voulez le faire en javascript brut, vous pouvez définir une fonction comme celle-ci:

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

Et utilisez-le comme ceci:

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

Notez qu'il datas'agit d'un objet, vous pouvez donc accéder à ses attributs sans avoir à l'analyser.

Robin Hartmann
la source
pourquoi utiliser .onload = function() {quand vous pouvez utiliser .onreadystatechange = function() { if (xhr.readState === 4) {je veux dire bien sûr, c'est plus court mais vous sacrifiez beaucoup de soutien pour sauver quelques personnages. This is not code-golf
Downgoat
4
Ce n'est pas seulement plus court, mais cela semble aussi être un peu plus fiable selon ce post . Et caniuse.com dit qu'il est pris en charge par tout sauf IE8, donc tant que vous n'avez pas besoin de prendre en charge IE8, je ne vois pas pourquoi vous n'utiliseriez pas onload.
Robin Hartmann le
@MikeySkullivan Je voulais savoir une chose, pourquoi est-ce que j'obtiens responseText et responseXML comme non définis alors que le statut de réponse = 200?
hrushi
1
@hrushi S'ils ne sont pas définis, vous y accédez d'une mauvaise manière ou dans le mauvais contexte. N'oubliez pas que vous devez utiliser xhr.responseText et xhr.responseXML et ils ne sont disponibles que dans le bloc de définition de fonction getJSON, pas en dehors.
Robin Hartmann
2
@MitchellD Utilisez-vous Node.js? Alors jetez un oeil ici . Mais la prochaine fois que vous essayez d'abord de rechercher l'erreur sur Google, le lien que j'ai publié est le premier résultat qui apparaît lorsque je tape l'erreur dans Google.
Robin Hartmann
81

Avec Chrome, Firefox, Safari, Edge et Webview, vous pouvez utiliser nativement l'API fetch, ce qui rend cela beaucoup plus facile et beaucoup plus laconique.

Si vous avez besoin de la prise en charge d'IE ou de navigateurs plus anciens, vous pouvez également utiliser le polyfill fetch .

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

Même si Node.js n'a pas cette méthode intégrée, vous pouvez utiliser node-fetch qui permet exactement la même implémentation.

DBrown
la source
6
Ugh .. cela ne compile même pas dans IE11. Pourquoi IE est-il si indésirable?
dano
4
Vous pouvez toujours utiliser le polyfill github / fetch pour résoudre ce problème.
DBrown
@dano ce sont les fonctions fléchées. Utilisez les fonctions régulières ou Babel pour transpiler
Phil
1
@Phil merci d'avoir signalé ES6. Le plus gros problème avec IE11 est que fetch n'est pas une API prise en charge: developer.mozilla.org/en-US/docs/Web/API/Fetch_API Il faut également savoir que l'extraction polyfill nécessaire pour IE11 est purement ES5 (en raison d'un manque de support), il n'y a donc aucun besoin réel de transpilation ES6 sauf si vous en avez absolument besoin autrement. Si la seule raison de l'ajouter est de prendre en charge l'idiome fetch (si le polyfill le prend même en charge), utiliser babel-polyfill est une meilleure option. Bonne chance!
DBrown
8

ES8 (2017) essayer

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

vous pouvez gérer les erreurs par try-catch

Kamil Kiełczewski
la source
7

Axios est un client HTTP à base de promesse pour le navigateur et Node.js .

Il offre des transformations automatiques pour les données JSON et c'est la recommandation officielle de l'équipe Vue.js lors de la migration à partir de la version 1.0 qui incluait un client REST par défaut.

Effectuer une GETdemande

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

Ou même axios(url)suffit car une GETdemande est la valeur par défaut.

Émile Bergeron
la source
3

Définissez une fonction comme:

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

Ensuite, utilisez-le comme ceci:

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

});
Dan Alboteanu
la source
1
Étant donné qu'il existe de nombreuses réponses existantes, veuillez mentionner ce qui mérite d'être ajouté à la discussion. L'utilisation de fetch a été mentionnée dans plusieurs réponses existantes.
ToolmakerSteve
2
C'est la seule réponse pertinente en 2020. Il s'agit simplement d'une extraction qui nécessite un rappel lorsqu'un événement asynchrone est terminé. Facile et élégant
lesolorzanov
pourquoi n'est pas fetchattendu dans ce cas? Je suis confus, je continue à voir des exemples où il est attendu et appelé clairement
Pynchia
0

ce matin, j'ai également eu le même doute et maintenant c'est effacé, je venais d'utiliser JSON avec l' api 'open-weather-map' ( https://openweathermap.org/ ) et j'ai obtenu des données de l'URL dans le fichier index.html, le code ressemble à ceci: -

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

J'avais donné la clé d'API ouvertement parce que j'avais un abonnement gratuit, il suffit d'avoir un abonnement gratuit au début. vous pouvez trouver de bonnes API et clés gratuites sur "rapidapi.com"

user12449933
la source
-1

Vous pouvez accéder aux données JSON en utilisant fetch () dans JavaScript

Mettez à jour le paramètre d'url de fetch () avec votre URL.

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

J'espère que cela aide, cela a parfaitement fonctionné pour moi.

Shivansh Srivastava
la source
2
Cela semble être un double de la réponse de DBrown . Veuillez ne pas ajouter de réponses en double. S'il y a quelque chose d'unique dans cette réponse, mentionnez la réponse de DBrown et expliquez ce qui est différent dans la vôtre.
ToolmakerSteve
-1
//Resolved
const fetchPromise1 = fetch(url);
    fetchPromise1.then(response => {
      console.log(response);
    });


//Pending
const fetchPromise = fetch(url);
console.log(fetchPromise);
ashish bandiwar
la source
1
ce n'est que le code réponse! ajouter quelques explications à l'article
Ram Ghadiyaram
2
Étant donné qu'il existe de nombreuses réponses existantes, veuillez mentionner ce qui mérite d'être ajouté à la discussion. L'utilisation de fetcha été mentionnée dans plusieurs réponses existantes.
ToolmakerSteve
-1

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

}


fetchDataAsync();

zq-jhon
la source
Veuillez décrire votre réponse.
Angel F Syrus
1
Étant donné qu'il existe de nombreuses réponses existantes, veuillez mentionner ce qui mérite d'être ajouté à la discussion. L'utilisation de fetcha été mentionnée dans plusieurs réponses existantes. L'utilisation de await/asyncavec fetch, a été décrite dans la réponse de Kamil .
ToolmakerSteve