Làm cách nào để lấy JSON từ URL trong JavaScript?


166

URL này trả về JSON:

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

Tôi đã thử điều này và nó đã không hoạt động:

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

console.log(count) // should be 1

Làm cách nào tôi có thể nhận được một đối tượng JavaScript từ phản hồi JSON của URL này?


1
Những gì bạn có là một URL trả về một phản hồi có chứa chuỗi JSON. Bạn đang hỏi làm thế nào để yêu cầu một cái gì đó từ một URL? Bởi vì điều đó sẽ phụ thuộc rất nhiều vào ngôn ngữ hoặc công cụ mà bạn đang sử dụng. Hãy cụ thể hơn.
jrajav

1
Câu hỏi này thật khó hiểu. Bạn không có được đối tượng JSON bằng cách sử dụng URL bạn đã đề cập? Ý bạn là gì khi lấy đối tượng JSON từ một URL? vui lòng làm rõ.
Steven

Câu trả lời:


165

Bạn có thể sử dụng .getJSON()chức năng 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
});

Nếu bạn không muốn sử dụng jQuery, bạn nên xem câu trả lời này cho giải pháp JS thuần túy: https://stackoverflow.com/a/2499647/1361042


14
Điểm nhỏ nhưng có thể rõ ràng hơn nếu nó ghi 'JSON nằm trong databiến'
Nathan Hornby

2
Ví dụ JavaScript thuần mà bạn trỏ đến là JSONP, không hoạt động với câu hỏi.
SArcher

137

Nếu bạn muốn làm điều đó trong javascript đơn giản, bạn có thể xác định một chức năng như thế này:

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

Và sử dụng nó như thế này:

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

Lưu ý rằng đó datalà một đối tượng, vì vậy bạn có thể truy cập các thuộc tính của nó mà không cần phải phân tích cú pháp.


Tại sao sử dụng .onload = function() {khi bạn có thể sử dụng .onreadystatechange = function() { if (xhr.readState === 4) {Tôi có nghĩa là chắc chắn, nó ngắn hơn nhưng bạn đang hy sinh rất nhiều hỗ trợ để cứu một vài nhân vật. Đây không phải là môn đánh gôn
Downgoat

4
Nó không chỉ ngắn hơn, mà còn có vẻ đáng tin cậy hơn theo bài đăng này . Và caniuse.com nói rằng nó được hỗ trợ bởi mọi thứ trừ IE8, vì vậy miễn là bạn không cần hỗ trợ IE8, tôi không hiểu tại sao bạn không sử dụng onload.
Robin Hartmann

@MikeySkullivan Tôi muốn biết một điều, tại sao tôi lại nhận được answerText và answerXML là không xác định mặc dù trạng thái phản hồi = 200?
hrushi

1
@hrushi Nếu chúng không được xác định, bạn đang truy cập chúng sai cách hoặc trong bối cảnh sai. Hãy nhớ rằng, bạn phải sử dụng xhr.responseText và xhr.responseXML và chúng chỉ có sẵn trong khối định nghĩa hàm getJSON, không nằm ngoài nó.
Robin Hartmann

2
@MitchellD Bạn có đang sử dụng Node.js không? Sau đó hãy xem qua đây . Nhưng lần tới, hãy thử tìm lỗi trước, liên kết tôi đã đăng là kết quả đầu tiên xuất hiện khi tôi nhập lỗi vào Google.
Robin Hartmann

81

Với Chrome, Firefox, Safari, Edge và Webview, bạn có thể sử dụng API tìm nạp một cách tự nhiên, điều này làm cho việc này dễ dàng hơn và ngắn gọn hơn nhiều.

Nếu bạn cần hỗ trợ cho IE hoặc các trình duyệt cũ hơn, bạn cũng có thể sử dụng polyfill tìm nạp .

let url = 'https://example.com';

fetch(url)
.then(res => res.json())
.then((out) => {
  console.log('Checkout this JSON! ', out);
})
.catch(err => { throw err });

MDN: Tìm nạp API

Mặc dù Node.js không tích hợp sẵn phương thức này, bạn có thể sử dụng tìm nạp nút cho phép thực hiện chính xác như vậy.


6
Ugh .. điều này thậm chí không được biên dịch trong IE11. Tại sao IE là rác như vậy?
dano

4
Bạn luôn có thể sử dụng github / fetch polyfill để khắc phục vấn đề này.
DBrown

@dano đó là chức năng mũi tên. Sử dụng các chức năng thông thường hoặc Babel để dịch mã
Phil

1
@Phil cảm ơn vì đã chỉ ra ES6. Vấn đề lớn nhất với IE11 là tìm nạp không phải là API được hỗ trợ: developer.mozilla.org/en-US/docs/Web/API/Fetch_API Cũng nên biết rằng polyfill tìm nạp cần thiết cho IE11 hoàn toàn là ES5 (do thiếu hỗ trợ), do đó không có nhu cầu thực sự cho dịch chuyển ES6 trừ khi bạn thực sự cần nó theo cách khác. Nếu lý do duy nhất để thêm nó là để hỗ trợ thành ngữ tìm nạp (nếu polyfill thậm chí hỗ trợ nó), sử dụng babel-polyfill là một lựa chọn tốt hơn. May mắn nhất!
DBrown

8

Hãy thử ES8 (2017)

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

bạn có thể xử lý lỗi bằng cách thử


7

Axios là một lời hứa dựa client HTTP cho trình duyệt và Node.js .

Nó cung cấp các biến đổi tự động cho dữ liệu JSON và đó là khuyến nghị chính thức từ nhóm Vue.js khi di chuyển từ phiên bản 1.0 bao gồm máy khách REST theo mặc định.

Thực hiện một GETyêu cầu

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

Hoặc thậm chí chỉ axios(url)là đủ vì một GETyêu cầu là mặc định.


3

Xác định hàm như:

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

Sau đó sử dụng nó như thế này:

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

});

1
Cho rằng có nhiều câu trả lời hiện có, xin vui lòng đề cập đến những gì về câu trả lời này làm cho nó đáng để thêm vào cuộc thảo luận. Việc sử dụng tìm nạp đã được đề cập trong một số câu trả lời hiện có.
ToolmakerSteve

2
Đây là câu trả lời duy nhất có liên quan trong năm 2020. Nó chỉ đơn giản là tìm nạp cần gọi lại khi sự kiện không đồng bộ được hoàn thành. Dễ dàng và thanh lịch
lesolorzanov

Tại sao không fetchđược chờ đợi trong trường hợp này? Tôi bối rối, tôi cứ nhìn thấy những ví dụ nơi nó được chờ đợi và được gọi một cách rõ ràng
Pynchia

0

sáng nay, tôi cũng có nghi ngờ tương tự và bây giờ nó đã được xóa, tôi vừa sử dụng JSON với 'bản đồ thời tiết mở' ( https://openweathermap.org/ ) api và nhận dữ liệu từ URL trong tệp index.html, mã trông như thế này: -

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

tôi đã cung cấp khóa api một cách công khai vì tôi đã đăng ký miễn phí, chỉ cần đăng ký miễn phí ngay từ đầu. bạn có thể tìm thấy một số api và chìa khóa miễn phí tốt tại "quickapi.com"


-1

Bạn có thể truy cập dữ liệu JSON bằng cách sử dụng fetch () trong JavaScript

Cập nhật tham số url của fetch () bằng url của bạn.

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

Hy vọng nó giúp, nó làm việc hoàn hảo cho tôi.


2
Điều này dường như là một bản sao câu trả lời của DBrown . Vui lòng không thêm câu trả lời trùng lặp. Nếu có điều gì đó độc đáo về câu trả lời này, thì hãy đề cập đến câu trả lời của DBrown và giải thích điều gì khác biệt về câu trả lời của bạn.
ToolmakerSteve

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


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

1
Đây là mã chỉ trả lời! thêm một số lời giải thích cho bài đăng
Ram Ghadiyaram

2
Cho rằng có nhiều câu trả lời hiện có, xin vui lòng đề cập đến những gì về câu trả lời này làm cho nó đáng để thêm vào cuộc thảo luận. Sử dụng fetchđã được đề cập trong một số câu trả lời hiện có.
ToolmakerSteve

-1

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

}


fetchDataAsync();


Hãy mô tả một cái gì đó về câu trả lời của bạn.
Thiên thần F Syrus

1
Cho rằng có nhiều câu trả lời hiện có, xin vui lòng đề cập đến những gì về câu trả lời này làm cho nó đáng để thêm vào cuộc thảo luận. Sử dụng fetchđã được đề cập trong một số câu trả lời hiện có. Cách sử dụng await/asyncvới tìm nạp, đã được mô tả trong câu trả lời của Kamil .
ToolmakerSteve
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.