Como obter JSON da URL em JavaScript?

166

Este URL retorna JSON:

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

Eu tentei isso e não funcionou:

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

console.log(count) // should be 1

Como posso obter um objeto JavaScript a partir da resposta JSON deste URL?

Yiğit Doğuş Özçelik
fonte
1
O que você tem é uma URL que retorna uma resposta que contém uma sequência JSON. Você está perguntando como solicitar algo de um URL? Porque isso dependeria muito do idioma ou ferramenta que você está usando. Seja mais específico.
jrajav
1
Esta pergunta é confusa. Você não obtém o objeto JSON usando a URL mencionada? O que você quer dizer com obter o objeto JSON de uma URL? por favor, esclareça.
Steven

Respostas:

165

Você pode usar a .getJSON()função 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 você não quiser usar o jQuery, consulte esta resposta para obter uma solução JS pura: https://stackoverflow.com/a/2499647/1361042

Dan Barzilay
fonte
14
Ponto de menor importância, mas pode ser mais clara se declarou 'O JSON está na datavariável'
Nathan Hornby
2
O exemplo puro de JavaScript que você aponta é para JSONP, que não funcionará com a pergunta.
SArcher 27/02
137

Se você quiser fazê-lo em javascript simples, poderá definir uma função como esta:

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 use-o assim:

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

Observe que dataé um objeto, para que você possa acessar seus atributos sem precisar analisá-lo.

Robin Hartmann
fonte
por que usar .onload = function() {quando você pode usar .onreadystatechange = function() { if (xhr.readState === 4) {, claro, é mais curto, mas você está sacrificando muito suporte para salvar alguns caracteres. Isso não é código-golfe
Downgoat 13/07/16
4
Não é apenas mais curto, mas também parece um pouco mais confiável, de acordo com este post . E o caniuse.com diz que é suportado por tudo, exceto o IE8, portanto, desde que você não precise dar suporte ao IE8, não vejo por que você não usaria o onload.
22616 Robin Hartmann
@ MikeySkullivan Eu queria saber uma coisa, por que estou recebendo responseText e responseXML como indefinidos, embora o status da resposta = 200?
hrushi
1
@hrushi Se eles não estiverem definidos, você os acessará de maneira errada ou no contexto errado. Lembre-se, você deve usar xhr.responseText e xhr.responseXML e eles estão disponíveis apenas no bloco de definição de função getJSON, e não fora dele.
Robin Hartmann
2
@MitchellD Você está usando o Node.js? Então dê uma olhada aqui . Mas, da próxima vez, tente pesquisar no Google primeiro pelo erro, o link que eu postei é o primeiro resultado que aparece quando eu digito o erro no Google.
9268 Robin Hoodmann
81

Com o Chrome, Firefox, Safari, Edge e Webview, você pode usar nativamente a API de busca, o que torna muito mais fácil e muito mais conciso.

Se você precisar de suporte para o IE ou navegadores mais antigos, também poderá usar o polyfill de busca .

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 de busca

Mesmo que o Node.js não tenha esse método interno, você pode usar a busca de nó, que permite exatamente a mesma implementação.

DBrown
fonte
6
Ugh .. isso nem compila no IE11. Por que o IE é tão lixo?
Dano
4
Você sempre pode usar o polyfill github / fetch para solucionar esse problema.
DBrown
@dano são as funções de seta. Use funções regulares ou Babel para transpile
Phil
1
@ Phil obrigado por apontar ES6. O maior problema do IE11 é que a busca não é uma API suportada: developer.mozilla.org/en-US/docs/Web/API/Fetch_API Também deve ser conhecido que o polyfill de busca necessário para o IE11 é puramente ES5 (devido à falta de suporte), portanto, não há necessidade real da transpilação do ES6, a menos que você precise absolutamente do contrário. Se o único motivo para adicioná-lo é oferecer suporte ao idioma de busca (se o polyfill o suportar), usar o babel-polyfill é uma opção melhor. Boa sorte!
DBrown 12/10/19
8

ES8 (2017) tente

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

você pode lidar com erros tentando

Kamil Kiełczewski
fonte
7

Axios é um cliente HTTP promessa base para o navegador e node.js .

Ele oferece transformações automáticas para dados JSON e é a recomendação oficial da equipe Vue.js. ao migrar da versão 1.0, que inclui um cliente REST por padrão.

Executando uma GETSolicitação

// 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 apenas axios(url)é suficiente, pois uma GETsolicitação é o padrão.

Emile Bergeron
fonte
3

Defina uma função como:

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

Em seguida, use-o assim:

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

});
Dan Alboteanu
fonte
1
Dado que existem muitas respostas existentes, mencione o que essa resposta faz valer a pena acrescentar à discussão. O uso da busca foi mencionado em várias respostas existentes.
Página Inicial>
2
Essa é a única resposta relevante em 2020. É simplesmente uma busca que precisa de um retorno de chamada para quando um evento assíncrono for concluído. Fácil e elegante
lesolorzanov
por que não é fetchesperado neste caso? Estou confuso, continuo vendo exemplos onde é esperado e sendo chamado claramente
Pynchia 14/06
0

hoje de manhã, eu também tive a mesma dúvida e agora está liberado, usei o JSON com a API 'open-weather-map' ( https://openweathermap.org/ ) e obtive dados da URL no arquivo index.html, o código fica assim: -

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

eu tinha dado a chave da API abertamente porque eu tinha assinatura grátis, apenas tenho uma assinatura grátis no começo. você pode encontrar algumas boas APIs e chaves gratuitas em "rapidapi.com"

user12449933
fonte
-1

Você pode acessar dados JSON usando fetch () em JavaScript

Atualize o parâmetro url de fetch () com seu URL.

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

Espero que ajude, funcionou perfeitamente para mim.

Shivansh Srivastava
fonte
2
Parece ser uma duplicata da resposta do DBrown . Por favor, não adicione respostas duplicadas. Se houver algo único nessa resposta, mencione a resposta do DBrown e explique o que há de diferente na sua.
Página Inicial>
-1
//Resolved
const fetchPromise1 = fetch(url);
    fetchPromise1.then(response => {
      console.log(response);
    });


//Pending
const fetchPromise = fetch(url);
console.log(fetchPromise);
ashish bandiwar
fonte
1
esta é apenas uma resposta de código! adicionar alguma explicação para o cargo
Ram Ghadiyaram
2
Dado que existem muitas respostas existentes, mencione o que essa resposta faz valer a pena acrescentar à discussão. O uso de fetchfoi mencionado em várias respostas existentes.
Página
-1

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

}


fetchDataAsync();

zq-jhon
fonte
Por favor, descreva algo sobre sua resposta.
Angel F Syrus
1
Dado que existem muitas respostas existentes, mencione o que essa resposta faz valer a pena acrescentar à discussão. O uso de fetchfoi mencionado em várias respostas existentes. O uso de await/asynccom busca foi descrito na resposta de Kamil .
Página