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 2012

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


14
マイナーなポイントですが、「JSONがdata変数に含まれている」と明記されていればより明確かもしれません
Nathan Hornby

2
あなたが指摘している純粋なJavaScriptの例はJSONP用であり、この質問では機能しません。
SArcher、2018

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 '13 / 07/13

4
この投稿によると、短いだけでなく、信頼性も少し高いようです。そしてcaniuse.comは、IE8以外のすべてでサポートされていると言っているので、IE8をサポートする必要がない限り、onloadを使用しない理由はわかりません。
Robin Hartmann

@MikeySkullivan 1つのことを知りたかったのですが、応答ステータス= 200であるにもかかわらず、なぜresponseTextおよびresponseXMLが未定義として取得されるのですか?
hrushi 2016年

1
@hrushiそれらが定義されていない場合、間違った方法または間違ったコンテキストでそれらにアクセスしています。xhr.responseTextとxhr.responseXMLを使用する必要があります。これらはgetJSON関数定義ブロック内でのみ使用でき、ブロック外では使用できません。
Robin Hartmann

2
@MitchellD Node.jsを使用していますか?次に、こちらをご覧ください。しかし、次にエラーを最初にグーグル検索してみると、投稿したリンクが、Googleにエラーを入力したときに最初に表示される結果です。
Robin Hartmann

81

Chrome、Firefox、Safari、Edge、およびWebviewを使用すると、ネイティブでフェッチAPIを使用できるため、これがはるかに簡単で簡潔になります。

IEまたは古いブラウザーのサポートが必要な場合は、フェッチポリフィルも使用できます。

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

Node.jsにはこのメソッドが組み込まれていませんが、まったく同じ実装が可能なnode-fetchを使用できます。


6
ええと…これはIE11でさえコンパイルされません。IEはなぜそんなにジャンクなのですか?
dano

4
この問題を解決するには、github / fetch polyfillをいつでも使用できます。
DBrown

@danoそれはアロー関数です。通常の関数またはバベルを使用してトランスパイルする
Phil

1
@Phil ES6を指摘してくれてありがとう。IE11の最大の問題は、フェッチがサポート れているAPIではないことです:developer.mozilla.org/en-US/docs/Web/API/Fetch_API IE11に必要なフェッチポリフィルは純粋にES5であることも知られているはずです(不足しているため)それ以外の場合は絶対に必要でない限り、ES6の翻訳​​は実際には必要ありません。追加する唯一の理由がフェッチイディオムをサポートすることである場合(ポリフィルがそれをサポートしている場合)、babel-polyfillを使用することをお勧めします。がんばって!
DBrown

8

ES8(2017)トライ

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

エラーをtry-catchで処理できます


7

Axios、ブラウザーおよびnode.js用のpromiseベースの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データにアクセスできます

fetch()のurlパラメータを自分の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
これはコードのみの回答です!投稿に説明を追加
Ram Ghadiyaram

2
多くの既存の回答があることを考慮して、この回答についての議論に追加する価値があるものについて言及してください。の使用法はfetch、いくつかの既存の回答で言及されています。
ToolmakerSteve

-1

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

}


fetchDataAsync();


あなたの答えについて何か説明してください。
エンジェルFシラス

1
多くの既存の回答があることを考慮して、この回答についての議論に追加する価値があるものについて言及してください。の使用法はfetch、いくつかの既存の回答で言及されています。await/asyncwith fetchの使用については、Kamilの回答で説明されています
ToolmakerSteve
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.