Jak uzyskać JSON z adresu URL w JavaScript?

166

Ten adres URL zwraca kod JSON:

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

Próbowałem tego i nie zadziałało:

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

console.log(count) // should be 1

Jak mogę uzyskać obiekt JavaScript z odpowiedzi JSON tego adresu URL?

Yiğit Doğuş Özçelik
źródło
1
Masz adres URL, który zwraca odpowiedź zawierającą ciąg JSON. Czy pytasz, jak poprosić o coś z adresu URL? Ponieważ zależy to w dużej mierze od języka lub narzędzia, którego używasz. Uszczegółów.
jrajav
1
To pytanie jest mylące. Nie otrzymujesz obiektu JSON za pomocą podanego adresu URL? Co masz na myśli, mówiąc o pobieraniu obiektu JSON z adresu URL? proszę o wyjaśnienie.
Steven

Odpowiedzi:

166

Możesz użyć .getJSON()funkcji 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
});

Jeśli nie chcesz używać jQuery, powinieneś spojrzeć na tę odpowiedź dla czystego rozwiązania JS: https://stackoverflow.com/a/2499647/1361042

Dan Barzilay
źródło
14
Drobna uwaga, ale może być jaśniejsza, gdyby brzmiała: „JSON jest w datazmiennej”
Nathan Hornby
2
Czysty przykład JavaScript, na który wskazujesz, dotyczy JSONP, który nie zadziała w przypadku tego pytania.
SArcher
137

Jeśli chcesz to zrobić w zwykłym javascript, możesz zdefiniować taką funkcję:

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

I użyj tego w ten sposób:

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

Zauważ, że datajest to obiekt, więc możesz uzyskać dostęp do jego atrybutów bez konieczności analizowania go.

Robin Hartmann
źródło
.onload = function() {po co używać, skoro możesz, to .onreadystatechange = function() { if (xhr.readState === 4) {znaczy oczywiście, jest krótszy, ale poświęcasz dużo wsparcia, aby uratować kilka postaci. To nie jest code-golf
Downgoat
4
Jest nie tylko krótszy, ale także wydaje się być odrobinę bardziej niezawodny zgodnie z tym postem . I caniuse.com mówi, że wspierany przez wszystko z wyjątkiem IE8, tak długo, jak nie trzeba wspierać IE8, nie widzę dlaczego nie użyłby onload.
Robin Hartmann
@MikeySkullivan Chciałem wiedzieć jedną rzecz, dlaczego otrzymuję tekst odpowiedzi i XML odpowiedzi jako niezdefiniowane, chociaż stan odpowiedzi = 200?
hrushi
1
@hrushi Jeśli są niezdefiniowane, uzyskujesz do nich dostęp w niewłaściwy sposób lub w niewłaściwym kontekście. Pamiętaj, że musisz używać xhr.responseText i xhr.responseXML i są one dostępne tylko w bloku definicji funkcji getJSON, a nie poza nim.
Robin Hartmann
2
@MitchellD Czy używasz Node.js? Spójrz tutaj . Ale następnym razem, gdy najpierw spróbuj znaleźć błąd w Google, opublikowany przeze mnie link jest pierwszym wynikiem, który pojawia się, gdy wpisuję błąd w Google.
Robin Hartmann
81

Dzięki Chrome, Firefox, Safari, Edge i Webview możesz natywnie korzystać z interfejsu API pobierania, co sprawia, że ​​jest to o wiele łatwiejsze i znacznie bardziej zwięzłe.

Jeśli potrzebujesz obsługi IE lub starszych przeglądarek, możesz również użyć wypełnienia pobierania .

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

Mimo że Node.js nie ma wbudowanej tej metody, możesz użyć pobierania węzła, który pozwala na dokładnie taką samą implementację.

Brązowy
źródło
6
Ugh… to nawet nie kompiluje się w IE11. Dlaczego IE to takie śmieci?
dano
4
Zawsze możesz użyć github / fetch polyfill, aby rozwiązać ten problem.
DBrown
@dano to funkcje strzałek. Użyj zwykłych funkcji lub Babel do transpozycji
Phil
1
@Phil dzięki za wskazanie ES6. Największym problemem związanym z IE11 jest to, że pobieranie nie jest obsługiwanym interfejsem API: developer.mozilla.org/en-US/docs/Web/API/Fetch_API Należy również wiedzieć, że wypełniacz pobierania wymagany dla IE11 to wyłącznie ES5 (z powodu braku wsparcia), więc nie ma rzeczywistej potrzeby transpilacji ES6, chyba że absolutnie potrzebujesz tego w inny sposób. Jeśli jedynym powodem dodania jest obsługa idiomu pobierania (jeśli polyfill nawet go obsługuje), użycie babel-polyfill jest lepszą opcją. Powodzenia!
DBrown,
8

ES8 (2017) spróbuj

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

możesz obsłużyć błędy przez try-catch

Kamil Kiełczewski
źródło
7

Axios jest klient HTTP obietnica oparte na przeglądarce i node.js .

Oferuje automatyczne transformacje danych JSON i jest to oficjalne zalecenie zespołu Vue.js podczas migracji z wersji 1.0, która domyślnie zawierała klienta REST.

Wykonywanie GETżądania

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

Lub nawet axios(url)wystarczy, ponieważ GETżądanie jest domyślne.

Emile Bergeron
źródło
3

Zdefiniuj funkcję, taką jak:

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

Następnie użyj tego w ten sposób:

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

});
Dan Alboteanu
źródło
1
Biorąc pod uwagę, że istnieje wiele odpowiedzi, proszę wspomnieć, co z tej odpowiedzi sprawia, że ​​warto ją dodać do dyskusji. Użycie pobierania zostało wspomniane w kilku istniejących odpowiedziach.
ToolmakerSteve
2
To jedyna odpowiednia odpowiedź w 2020 r. Jest to po prostu pobieranie, które wymaga wywołania zwrotnego po zakończeniu zdarzenia asynchronicznego. Łatwe i eleganckie
lesolorzanov
dlaczego nie jest fetchoczekiwany w tym przypadku? Jestem zdezorientowany, ciągle widzę przykłady, gdzie jest oczekiwany i wyraźnie nazywany
Pynchia
0

dziś rano miałem te same wątpliwości i teraz zostało to wyjaśnione, właśnie użyłem JSON z api „open-weather-map” ( https://openweathermap.org/ ) i uzyskałem dane z adresu URL w pliku index.html, kod wygląda następująco: -

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

Podałem klucz API otwarcie, ponieważ miałem bezpłatną subskrypcję, po prostu mam darmowe subskrypcje na początku. kilka dobrych darmowych interfejsów API i kluczy można znaleźć na stronie „rapidapi.com”

user12449933
źródło
-1

Dostęp do danych JSON można uzyskać za pomocą funkcji fetch () w JavaScript

Zaktualizuj parametr url funkcji fetch () za pomocą swojego adresu URL.

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

Mam nadzieję, że to pomaga, działało idealnie dla mnie.

Shivansh Srivastava
źródło
2
Wydaje się, że jest to duplikat odpowiedzi DBrown . Nie dodawaj zduplikowanych odpowiedzi. Jeśli jest coś wyjątkowego w tej odpowiedzi, wspomnij o odpowiedzi DBrown i wyjaśnij, co różni się w Twojej.
ToolmakerSteve
-1
//Resolved
const fetchPromise1 = fetch(url);
    fetchPromise1.then(response => {
      console.log(response);
    });


//Pending
const fetchPromise = fetch(url);
console.log(fetchPromise);
Ashish Bandiwar
źródło
1
to jest tylko kod odpowiedź! dodaj wyjaśnienie do postu
Ram Ghadiyaram
2
Biorąc pod uwagę, że istnieje wiele odpowiedzi, proszę wspomnieć, co z tej odpowiedzi sprawia, że ​​warto ją dodać do dyskusji. Wykorzystanie programu fetchzostało wspomniane w kilku istniejących odpowiedziach.
ToolmakerSteve
-1

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

}


fetchDataAsync();

zq-jhon
źródło
Opisz coś o swojej odpowiedzi.
Angel F Syrus
1
Biorąc pod uwagę, że istnieje wiele odpowiedzi, proszę wspomnieć, co z tej odpowiedzi sprawia, że ​​warto ją dodać do dyskusji. Wykorzystanie programu fetchzostało wspomniane w kilku istniejących odpowiedziach. Użycie await/asyncz pobieraniem zostało opisane w odpowiedzi Kamila .
ToolmakerSteve