如何从JavaScript中的URL获取JSON?


166

此URL返回JSON:

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

我尝试了一下,但没有成功:

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

console.log(count) // should be 1

如何从该URL的JSON响应中获取JavaScript对象?


1
您所拥有的是一个URL,该URL返回包含JSON字符串的响应。您是否在询问如何从URL请求内容?因为那将在很大程度上取决于您所使用的语言或工具。更加详细一些。
jrajav 2012年

1
这个问题令人困惑。您是否通过使用提到的URL获得JSON对象?从URL获取JSON对象是什么意思?请澄清。
史蒂文

Answers:


165

您可以使用jQuery .getJSON()函数:

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

如果您不想使用jQuery,则应查看以下答案以获取纯JS解决方案:https : //stackoverflow.com/a/2499647/1361042


14
次要点,但如果声明为“ JSON位于data变量中”,可能会更清楚
Nathan Hornby,2017年

2
您指向的纯JavaScript示例是针对JSONP的,不适用于该问题。
SArcher '18

137

如果要使用普通的javascript,可以定义如下函数:

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

并像这样使用它:

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

请注意,这data是一个对象,因此您无需分析即可访问其属性。


为什么使用,.onload = function() {何时可以使用.onreadystatechange = function() { if (xhr.readState === 4) {我的意思是,它虽然较短,但是您牺牲了对保存几个字符的大量支持。这不是代码高尔夫球
Downgoat '16

4
根据这篇文章,它不仅更短,而且似乎还更可靠。而caniuse.com说,它是由不同的IE8的一切支持,所以只要你不需要支持IE8,我不明白为什么你不使用的onload。
罗宾·哈特曼

@MikeySkullivan我想知道一件事,尽管响应状态= 200,为什么为什么我得到的responseText和responseXML为未定义?
hrushi

1
@hrushi如果未定义它们,则说明您以错误的方式或在错误的上下文中访问它们。请记住,您必须使用xhr.responseText和xhr.responseXML,它们仅在getJSON函数定义块中可用,而在其外部不可用。
罗宾·哈特曼

2
@MitchellD您在使用Node.js吗?然后在这里看看。但是下一次尝试首先搜索错误时,我在Google上输入错误时发布的第一个结果就是我发布的链接。
罗宾·哈特曼

81

借助Chrome,Firefox,Safari,Edge和Webview,您可以本地使用fetch API,这使此操作变得更加简单和简洁。

如果您需要IE或更旧版本的浏览器的支持,也可以使用fetch polyfill

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

即使Node.js没有内置此方法,您也可以使用node-fetch来实现完全相同的实现。


6
gh ..这甚至没有在IE11中编译。IE为什么这么垃圾?
dano

4
您可以始终使用github / fetch polyfill来解决此问题。
DBrown

@dano是箭头功能。使用常规功能或Babel进行翻译
Phil

1
@Phil感谢您指出ES6。IE11的最大问题是fetch不是受支持的API:developer.mozilla.org/en-US/docs/Web/API/Fetch_API 还应该知道IE11所需的fetch polyfill纯粹是ES5(由于缺少)支持),因此除非您绝对需要,否则实际上不需要进行ES6移植。如果添加它的唯一原因是支持fetch习惯用法(如果polyfill甚至支持它),则使用babel-polyfill是更好的选择。祝你好运!
DBrown

8

ES8(2017)尝试

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

您可以通过try-catch处理错误


7

Axios用于浏览器和node.js的基于Promise 的HTTP客户端

它提供了JSON数据的自动转换功能,这是Vue.js团队的正式建议,当从默认版本(包括REST客户端)的1.0版本进行迁移时。

执行GET请求

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

甚至仅仅axios(url)是一个GET请求就足够了,因为请求是默认的。


3

定义一个类似的函数:

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

然后像这样使用它:

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

});

1
鉴于存在许多现有答案,请提及该答案的内容使它值得增加讨论。在几个现有的答案中都提到了提取的用法。
制造商史蒂夫(Steve),

2
这是2020年唯一相关的答案。这只是一个提取,需要在异步事件完成时进行回调。轻松而优雅
lesolorzanov

为什么fetch在这种情况下没有等待?我很困惑,我不断看到等待它的例子,并被简单地称呼
皮钦查

0

今天早上,我也有同样的疑问,现在我已经将JSON与'open-weather-map'(https://openweathermap.org/)api一起使用,并从index.html文件中的URL获取数据,代码看起来像这样:

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

我已经公开给出了api密钥,因为我有免费订阅,一开始只是免费订阅。您可以在“ rapidapi.com”上找到一些不错的免费api和密钥


-1

您可以使用JavaScript中的fetch()访问JSON数据

使用您的网址更新fetch()的网址参数。

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

希望对您有帮助,对我来说效果很好。


2
这似乎是DBrown答案的重复。请不要添加重复的答案。如果此答案有独特之处,请提及DBrown的答案,并说明您的答案有何不同。
制造商史蒂夫(Steve),

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


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

1
这只是代码答案!在帖子中添加一些说明
Ram Ghadiyaram

2
鉴于存在许多现有答案,请提及该答案的内容使它值得增加讨论。fetch在几个现有的答案中都提到了的用法。
制造商

-1

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

}


fetchDataAsync();


请描述您的答案。
安吉尔·塞鲁斯

1
鉴于存在许多现有答案,请提及该答案的内容使它值得增加讨论。fetch在几个现有的答案中都提到了的用法。await/asynckamil的答案中描述了with fetch的用法。
制造商史蒂夫(Steve)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.