【jQuery】JSONデータを取得・表示する完全ガイド|$.getJSON・REST API・エラー処理・ローカルJSON・fetch比較まで

jQueryの $.getJSON() を使うと、REST APIや外部サービスからJSONデータを簡単に取得できます。この記事では$.getJSONの基本・REST APIからのデータ取得・DOM描画・エラー処理・ローカルJSONファイルの読み込み・fetchとの比較まで解説します。

この記事でわかること

  • $.getJSON() でJSONデータを取得する基本的な使い方
  • REST APIからデータを取得してDOMに表示する
  • エラーハンドリングとローディング表示
  • ローカルのJSONファイルを読み込む
  • JSON.parse / JSON.stringify との使い分け
スポンサーリンク

$.getJSON() の基本的な使い方

// $.getJSON(url, callback) → レスポンスを自動でJSONパース
$.getJSON('/api/users', function (data) {
  console.log('取得データ:', data);
  console.log('件数:', data.length);    // 配列の場合
  console.log('名前:', data[0].name);   // オブジェクトのプロパティ
});

// Promiseチェーンで書く(推奨: エラーも処理できる)
$.getJSON('/api/users')
  .done(function (data) {
    console.log('成功:', data);
  })
  .fail(function (jqXHR, textStatus, errorThrown) {
    console.error('失敗:', jqXHR.status, errorThrown);
  });
$.getJSON は $.ajax の shorthand
$.getJSON(url, fn)$.ajax({ url, type: "GET", dataType: "json" }) と同等です。JSONパースはjQueryが自動で行うため、JSON.parse() を手動で呼ぶ必要はありません。

REST APIからデータを取得してDOMに表示する

<ul id="user-list"><li id="loading">読み込み中...</li></ul>
$(function () {
  $.getJSON('https://jsonplaceholder.typicode.com/users')
    .done(function (users) {
      var $list = $('#user-list').empty();

      $.each(users, function (i, user) {
        var $li = $('<li>')
          .append($('<strong>').text(user.name))
          .append(' — ')
          .append($('<span>').text(user.email));
        $list.append($li);
      });
    })
    .fail(function () {
      $('#user-list').html('<li>データの取得に失敗しました</li>');
    });
});
ユーザーデータはXSS対策でtextContentで挿入する
APIから取得したデータをそのままHTMLとして挿入すると、XSSの脆弱性が生じます。jQueryの .text().append($("<span>").text(...)) を使えば、HTMLエスケープが自動で行われます。.html() に未検証のデータを渡さないでください。

ネストされたJSONデータの扱い

// 例: { "user": { "name": "山田", "address": { "city": "東京" } }, "posts": [...] }
$.getJSON('/api/profile')
  .done(function (data) {
    var user    = data.user;
    var city    = data.user.address.city;
    var posts   = data.posts; // 配列

    console.log(user.name, city);

    // 配列はeachで処理
    $.each(posts, function (i, post) {
      console.log(i, post.title);
    });

    // または JavaScript のmap/filter
    var titles = posts.map(function (p) { return p.title; });
    console.log('タイトル一覧:', titles);
  });

ローカルのJSONファイルを読み込む

Webサーバー経由でJSONファイルを読み込む方法です(file:// プロトコルでは動作しません)。

// サーバー上の /data/config.json を読み込む
$.getJSON('/data/config.json')
  .done(function (config) {
    console.log('設定値:', config.theme, config.language);
    applyConfig(config);
  })
  .fail(function (jqXHR) {
    if (jqXHR.status === 404) {
      console.error('設定ファイルが見つかりません');
    }
  });

$.getJSON / $.ajax / fetch の使い分け

方法 特徴 使い所
$.getJSON() シンプル・自動パース GETでJSONを取得するだけ
$.ajax() POST/PUT/DELETEも可能・詳細設定 ヘッダー付与・認証・POST送信
fetch() 標準API・async/await対応 新規プロジェクト・jQuery不使用
JSON.parse() 文字列をJSONオブジェクトに変換 localStorage/cookieのデータ変換

まとめ

jQueryでJSONデータを取得する際のポイントをまとめます。

  • 基本: $.getJSON(url).done()/.fail()
  • DOM挿入: .text() を使ってXSSを防ぐ
  • 配列データ: $.each() または .map() で処理
  • ローカルJSONはサーバー経由で読み込む(file://は非対応)

関連記事: GETリクエストを送信する方法 / POSTリクエストを送信する方法 / 検索サジェスト機能の完全ガイド

よくある質問(FAQ)

Q取得したJSONをコンソールで確認する方法は?
Aconsole.log(data) で取得したオブジェクト全体を確認できます。ブラウザの開発者ツール(F12 → コンソール)でオブジェクトを展開して内部構造を確認してください。console.log(JSON.stringify(data, null, 2)) でインデント付きの文字列として表示することもできます。
Q「Unexpected end of JSON input」エラーが出ます。
Aサーバーが空のレスポンスや不正なJSON文字列を返している場合に発生します。開発者ツールのNetworkタブでレスポンスの内容を確認してください。APIがnullや空文字を返す場合は dataType: "text" にして手動パースするか、サーバー側で必ずJSONを返すよう修正してください。
Q取得したデータを別の関数に渡したいです。
AAjax処理は非同期なため、.done() のコールバック内で関数を呼び出す必要があります。.done(function(data) { processData(data); }) のように書いてください。コールバック外では非同期処理の結果はまだ取得されていません。
QクロスドメインのJSONPを取得したいです。
AJSONP(JSON with Padding)はCORS普及前の手法で、現在は非推奨です。代わりにサーバー側でCORSヘッダー(Access-Control-Allow-Origin)を設定する方法を使ってください。どうしてもJSONPを使う場合は $.ajax({ url, dataType: "jsonp" }) で対応できます。
Q取得したJSONをlocalStorageにキャッシュしたいです。
AlocalStorageは文字列のみ保存できるため、JSON.stringify() で変換して保存します:localStorage.setItem("cache", JSON.stringify(data))読み出し時は JSON.parse(localStorage.getItem("cache")) で戻します。キャッシュの有効期限管理は、保存時にタイムスタンプも一緒に保存して判定します。