Come ottenere JSON dall'URL in JavaScript?


166

Questo URL restituisce JSON:

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

Ho provato questo, e non ha funzionato:

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

console.log(count) // should be 1

Come posso ottenere un oggetto JavaScript dalla risposta JSON di questo URL?


1
Quello che hai è un URL che restituisce una risposta contenente una stringa JSON. Stai chiedendo come richiedere qualcosa da un URL? Perché ciò dipenderebbe molto dalla lingua o dallo strumento che stai usando. Sii più preciso.
jrajav,

1
Questa domanda è confusa. Non ottieni l'oggetto JSON usando l'URL che hai citato? Cosa intendi per ottenere l'oggetto JSON da un URL? si prega di precisare.
Steven,

Risposte:


165

È possibile utilizzare la .getJSON()funzione 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
});

Se non si desidera utilizzare jQuery, consultare questa risposta per una soluzione JS pura: https://stackoverflow.com/a/2499647/1361042


14
Punto minore ma potrebbe essere più chiaro se affermasse "Il JSON è nella datavariabile"
Nathan Hornby

2
L'esempio JavaScript puro che indichi è per JSONP, che non funzionerà con la domanda.
Sacher

137

Se vuoi farlo in semplice javascript, puoi definire una funzione come questa:

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

E usalo in questo modo:

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

Si noti che dataè un oggetto, quindi è possibile accedere ai suoi attributi senza doverlo analizzare.


perché usarlo .onload = function() {quando puoi usarlo, .onreadystatechange = function() { if (xhr.readState === 4) {intendo, è più breve ma stai sacrificando un grande supporto per salvare un paio di personaggi. Non si tratta di code-golf
Downgoat,

4
Non è solo più breve, ma sembra anche un po 'più affidabile secondo questo post . E caniuse.com dice che è supportato da tutto tranne IE8, quindi finché non hai bisogno di supportare IE8, non vedo perché non dovresti usare onload.
Robin Hartmann,

@MikeySkullivan Volevo sapere una cosa, perché sto ricevendo responseText e responseXML come indefinito anche se lo stato della risposta è 200?
Hrushi,

1
@hrushi Se non sono definiti, li stai accedendo in modo sbagliato o nel contesto sbagliato. Ricorda, devi usare xhr.responseText e xhr.responseXML e sono disponibili solo all'interno del blocco di definizione della funzione getJSON, non al di fuori di esso.
Robin Hartmann,

2
@MitchellD Stai usando Node.js? Dai un'occhiata qui . Ma la prossima volta prova a cercare su Google l'errore per primo, il link che ho pubblicato è il primo risultato che compare quando scrivo l'errore in Google.
Robin Hartmann,

81

Con Chrome, Firefox, Safari, Edge e Webview puoi utilizzare in modo nativo l'API di recupero che lo rende molto più semplice e molto più conciso.

Se hai bisogno di supporto per IE o browser meno recenti, puoi anche utilizzare il recupero polifill .

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 di recupero

Anche se Node.js non ha questo metodo integrato, puoi usare node-fetch che consente esattamente la stessa implementazione.


6
Uh ... questo non si compila nemmeno in IE11. Perché IE è così spazzatura?
dano,

4
Puoi sempre utilizzare il polyfill github / fetch per superare questo problema.
DBrown,

@dano sono le funzioni freccia. Usa le funzioni regolari o Babele per trascrivere
Fil

1
@Phil grazie per aver sottolineato ES6. Il problema più grande con IE11 è che il recupero non è un'API supportata: developer.mozilla.org/en-US/docs/Web/API/Fetch_API Dovrebbe anche essere noto che il polyfill di recupero necessario per IE11 è puramente ES5 (a causa della mancanza di supporto), quindi non vi è alcuna effettiva necessità di traspilazione ES6 a meno che non sia assolutamente necessario diversamente. Se l'unico motivo per aggiungerlo è supportare il linguaggio di recupero (se il polyfill lo supporta anche), usare babel-polyfill è un'opzione migliore. Buona fortuna!
DBrown,

8

ES8 (2017) prova

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

puoi gestire gli errori con try-catch


7

Axios è un client HTTP promessa based per il browser e node.js .

Offre trasformazioni automatiche per i dati JSON ed è la raccomandazione ufficiale del team Vue.js durante la migrazione dalla versione 1.0 che includeva un client REST per impostazione predefinita.

Esecuzione di una GETrichiesta

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

O anche solo axios(url)è abbastanza come una GETrichiesta è l'impostazione predefinita.


3

Definire una funzione come:

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

Quindi usalo in questo modo:

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

});

1
Dato che ci sono molte risposte esistenti, si prega di menzionare ciò che su questa risposta vale la pena aggiungere alla discussione. L'uso del recupero è stato menzionato in diverse risposte esistenti.
ToolmakerSteve

2
Questa è l'unica risposta pertinente nel 2020. È semplicemente un recupero che richiede una richiamata per il completamento di un evento asincrono. Semplice ed elegante
lesolorzanov il

perché non è fetchatteso in questo caso? Sono confuso, continuo a vedere esempi in cui è atteso e viene chiamato chiaramente
Pynchia il

0

stamattina ho avuto anche lo stesso dubbio e ora è stato cancellato che avevo appena usato JSON con 'open-weather-map' ( https://openweathermap.org/ ) api e ottenuto i dati dall'URL nel file index.html, il codice è simile al seguente: -

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

avevo dato apertamente la chiave API perché avevo un abbonamento gratuito, all'inizio ho solo un abbonamento gratuito. puoi trovare alcune buone API e chiavi gratuite su "rapidapi.com"


-1

Puoi accedere ai dati JSON usando fetch () in JavaScript

Aggiorna il parametro url di fetch () con il tuo url.

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

Spero che sia d'aiuto, ha funzionato perfettamente per me.


2
Questo sembra essere un duplicato della risposta di DBrown . Si prega di non aggiungere risposte duplicate. Se c'è qualcosa di unico in questa risposta, menziona la risposta di DBrown e spiega cosa c'è di diverso nella tua.
ToolmakerSteve

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


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

1
questa è solo risposta al codice! aggiungi una spiegazione al post
Ram Ghadiyaram il

2
Dato che ci sono molte risposte esistenti, si prega di menzionare ciò che su questa risposta vale la pena aggiungere alla discussione. L'uso di fetchè stato menzionato in diverse risposte esistenti.
ToolmakerSteve

-1

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

}


fetchDataAsync();


Descrivi qualcosa sulla tua risposta.
Angel F Syrus,

1
Dato che ci sono molte risposte esistenti, si prega di menzionare ciò che su questa risposta vale la pena aggiungere alla discussione. L'uso di fetchè stato menzionato in diverse risposte esistenti. L'uso di await/asynccon fetch, è stato descritto nella risposta di Kamil .
ToolmakerSteve
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.