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
당신이 가진 것은 JSON 문자열을 포함하는 응답을 반환하는 URL입니다. URL에서 무언가를 요청하는 방법을 묻고 있습니까? 사용중인 언어 나 도구에 따라 크게 달라지기 때문입니다. 더 구체적으로 말하십시오.
jrajav

1
이 질문은 혼란 스럽다. 언급 한 URL을 사용하여 JSON 객체를 얻지 못합니까? URL에서 JSON 객체를 얻는다는 것은 무엇을 의미합니까? 명확히하십시오.
Steven

답변:


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 : //.com/a/2499647/1361042


14
사소한 점이지만 'JSON이 data변수에 있습니다' 라고 표시하면 더 명확 할 수 있습니다.
Nathan Hornby

2
당신이 가리키는 순수한 JavaScript 예제는 JSONP에 대한 것이며, 질문에는 작동하지 않습니다.
SArcher

137

일반 자바 스크립트로 작성하려면 다음과 같은 함수를 정의 할 수 있습니다.

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

4
이 게시물 에 따르면 더 짧을뿐만 아니라 조금 더 신뢰할만한 것 같습니다 . 그리고 caniuse.com에 따르면 IE8을 제외한 모든 것이 지원되므로 IE8을 지원할 필요가 없으면 왜 onload를 사용하지 않는지 알 수 없습니다.
Robin Hartmann

@MikeySkullivan 한 가지만 알고 싶었습니다. 응답 상태 = 200인데도 responseText와 responseXML이 정의되지 않은 것으로 나타납니다.
hrushi

1
@hrushi 정의되지 않은 경우 잘못된 방식으로 또는 잘못된 컨텍스트로 액세스하고 있습니다. xhr.responseText 및 xhr.responseXML을 사용해야하며 getJSON 함수 정의 블록 내에서만 사용할 수 있으며 외부에서는 사용할 수 없습니다.
Robin Hartmann

2
@MitchellD Node.js를 사용하고 있습니까? 그런 다음 여기를 살펴보십시오 . 그러나 다음에 오류를 먼저 인터넷 검색을 시도하면 내가 게시 한 링크가 Google에 오류를 입력 할 때 나타나는 첫 번째 결과입니다.
Robin Hartmann

81

Chrome, Firefox, Safari, Edge 및 Webview에서는 기본적으로 페치 API를 사용하여 훨씬 쉽고 간결하게 만들 수 있습니다.

IE 또는 이전 브라우저를 지원해야하는 경우 페치 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
어 .. IE11에서도 컴파일되지 않습니다. 왜 IE가 정크입니까?
dano

4
이 문제를 극복하기 위해 항상 github / fetch polyfill을 사용할 수 있습니다.
DBrown

@dano 화살표 기능입니다. 정규 함수 또는 바벨을 사용하여 번역
Phil

1
@ ES6을 지적 해 주셔서 감사합니다. IE11의 가장 큰 문제는 지원되는 API 인출되지 않는 것입니다 : developer.mozilla.org/en-US/docs/Web/API/Fetch_API 그것은 또한이 polyfill IE11에 필요한 불러오는 것으로 알려져해야한다 순전히 ES5 (때문에 부족 ES6 transpilation이 실제로 필요한 경우가 아니면 절대적으로 필요하지 않은 한 ES6 트랜스 필 레이션이 필요하지 않습니다. 추가해야 할 유일한 이유가 페치 관용구를 지원하는 것이라면 (폴리 필이 지원하는 경우) babel-polyfill을 사용하는 것이 더 좋습니다. 행운을 빕니다!
DBrown 2009 년

8

ES8 (2017) 시도

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

try-catch로 오류를 처리 할 수 ​​있습니다


7

Axios브라우저 및 node.js에 대한 약속 기반 HTTP 클라이언트입니다 .

JSON 데이터에 대한 자동 변환을 제공 하며 기본적으로 REST 클라이언트가 포함 된 1.0 버전에서 마이그레이션 할 때 Vue.js 팀의 공식 권장 사항입니다 .

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
기존 답변이 많이 있으므로이 답변에 대해 토론에 추가 할만한 가치가있는 부분을 언급하십시오. 페치 사용법은 여러 기존 답변에서 언급되었습니다.
ToolmakerSteve

2
이것은 2020 년의 유일한 관련 답변입니다. 비동기 이벤트가 완료 될 때 콜백이 필요한 페치 일뿐입니다. 쉽고 우아한
lesolorzanov

fetch이 경우 왜 기다리지 않습니까? 나는 혼란스럽고, 그것이 기다리고 있고 명백하게 호출되는 예를 계속보고있다
Pynchia

0

오늘 아침에도 같은 의심이 들었고 이제는 'open-weather-map'( https://openweathermap.org/ ) api와 함께 JSON을 사용 하고 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 데이터에 액세스 할 수 있습니다.

URL로 fetch ()의 url 매개 변수를 업데이트하십시오.

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

희망 그것은 그것이 나를 위해 완벽하게 작동했습니다.


2
이것은 DBrown의 답변 과 중복 된 것으로 보입니다 . 중복 답변을 추가하지 마십시오. 이 답변에 고유 한 것이 있다면 DBrown의 답변을 언급하고 귀하의 답변과 다른 점을 설명하십시오.
ToolmakerSteve

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


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

1
이것은 코드 전용 답변입니다! 게시물에 몇 가지 설명을 추가
램 Ghadiyaram에게

2
기존 답변이 많이 있으므로이 답변에 대해 토론에 추가 할만한 가치가있는 부분을 언급하십시오. fetch몇 가지 기존 답변에서 사용법 이 언급되었습니다.
ToolmakerSteve

-1

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

}


fetchDataAsync();


답변에 대해 설명해주세요.
Angel F Syrus

1
기존 답변이 많이 있으므로이 답변에 대해 토론에 추가 할만한 가치가있는 부분을 언급하십시오. fetch몇 가지 기존 답변에서 사용법 이 언급되었습니다. await/asyncwith fetch의 사용법은 Kamil의 답변 에 설명되어 있습니다.
ToolmakerSteve
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.