JavaScriptでネストされたJSONを読み取ってみよう!(複雑な構造の読み解き)

完成イメージ(JSON → スライドショーの例)

下記のスライドでは、実際に JSONデータをAPIから取得し、それを使って画像スライドショーを表示する例を紹介しています。画像ファイルを自分で用意する必要はなく、すべてAPIから自動で取得して表示されます。

このページでできること・学べること

JavaScriptでネストされたJSON(入れ子構造のデータ)を読み取り、必要な値だけを取り出して表示する方法を解説します。

外部APIや商品データ、楽天API・Unsplash APIなど、実際のWebサービスでは複雑なJSON構造が当たり前です。
そのため、

  • JavaScriptの fetch() を使ったJSONの取得方法
  • data.Items[0].Item.title のようなオブジェクト・配列の読み方
  • .forEach() を使った複数商品の表示方法
  • .?.(オプショナルチェイニング)でエラーを防ぐ書き方
    を実際のコードと一緒に学べるように構成しています。

「JSON 取り出し方」「JavaScript ネストされたデータ」「fetch JSON サンプル」と検索してきた方にも役立つ内容です。

あわせて読みたい
JavaScriptでAPI:外部データを取得してみよう!( API then) 完成イメージ APIを使って、ボタンをクリックするたびに異なる画像をランダムに表示してみましょう。 今回のテーマ JavaScript の fetch() を使って、外部からデータを...
あわせて読みたい
JavaScriptでAPI:外部データを取得してみよう!( API async await) 完成イメージ 郵便番号を入力し、住所検索ボタンをクリックしたら都道府県・市区・町域が自動で取得できるAPIを作成してみよう APIで犬の画像をランダムに取得し、ボタ...

目的

  • fetch() でローカルJSONファイルや外部APIからデータを取得する
  • ネストされたオブジェクト・配列の構造を理解する
  • .forEach() を使って複数のデータを一覧で表示する
  • .?(optional chaining)などでエラーを防ぎながら安全にアクセスする

作成するファイルとフォルダ構成

js-domフォルダに以下のファイルを作成してください。

ファイル名内容
js-dom08.html動作練習用HTML/js
products.json静的なローカルJSON

JavaScriptは <script> タグ内に直接記述してください(内部JS)

チェックポイント

  • JSONデータを取得し、正しくオブジェクトとして扱えているか?
  • オブジェクト → 配列 → オブジェクト…といったネスト構造に正しくアクセスできているか?
  • 必要なデータだけを取り出し、HTMLとして表示できているか?
  • ループ処理(forEach)を使って、複数の要素を繰り返し表示できているか?

【基礎】JSONファイルを読み込んで表示するコード

jsonファイルを用意して作成

商品情報のjsonファイルを用意します。そのファイルを読み込んで表示します。

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>商品情報を表示しよう</title>
</head>
<body>
  <h1>商品データの表示</h1>
  <p><button id="load-btn">商品を読み込む</button></p>

  <div id="item-area">
    <!-- 商品データが表示されます -->
  </div>

  <script>
    const btn = document.getElementById('load-btn');
    const area = document.getElementById('item-area');

    btn.addEventListener('click', () => {
      fetch('products.json')
        .then(response => response.json())
        .then(data => {
          console.log(data);  // JSON構造確認用
          const item = data.Items[0].Item;
          const html = `
            <h2>${item.title}</h2>
            <img src="${item.image}" alt="${item.title}" width="200">
            <p>価格:${item.price}円</p>
            <p>販売店:${item.shop.name}</p>
          `;
          area.innerHTML = html;
        })
        .catch(error => {
          area.textContent = 'データの取得に失敗しました。';
          console.error('エラー:', error);
        });
    });
  </script>
</body>
</html>

products.json(同じ階層に保存)

{
  "Items": [
    {
      "Item": {
        "title": "JavaScript入門",
        "price": 2200,
        "image": "https://placehold.jp/200x150.png?text=JS+Book",
        "shop": {
          "name": "技術書オンライン",
          "url": "https://example.com"
        }
      }
    }
  ]
}

アクセス方法の例(JavaScript)

// 配列の1件目の商品データを取り出す
const item = data.Items[0].Item;

// 商品タイトル
console.log(item.title);  // → JavaScript入門

// 商品画像
console.log(item.image);

// 店舗名
console.log(item.shop.name);

// 店舗URL
console.log(item.shop.url);

ネスト構造の考え方

  • Items → 商品一覧(配列)
  • Item → 各商品の本体(オブジェクト)
  • shop → Itemの中の「販売店情報」(さらにオブジェクト)

JSONとは?

JSON(ジェイソン)とは、JavaScript Object Notation(ジャバスクリプト オブジェクト表記)の略で、
データをやり取りするときの「決まった形(ルール)」です。

  • データは 文字列(テキスト)として受け取られる
  • JavaScriptの .json() を使うと、オブジェクトとして使える形に変換できる
  • オブジェクト({})と配列([])を組み合わせることで、複雑な構造も表現できる

今回扱う複雑にネストされたJSONデータのイメージ

{
  "Items": [
    {
      "Item": {
        "title": "JavaScript入門",
        "price": 2200,
        "image": "https://example.com/img1.jpg",
        "shop": {
          "name": "技術書オンライン",
          "url": "https://example.com/shop"
        }
      }
    }
  ]
}

このようなデータから、JavaScriptを使って

const title = data.Items[0].Item.title;
const image = data.Items[0].Item.image;
const shopName = data.Items[0].Item.shop.name;

のようにアクセスし、**必要な値を画面に表示していきます。

自動スライドショーのためのUnsplash API の場合

様々な画像をAPIを使って取得することが可能です。

const accessKey = "あなたのAPIアクセスキー";

fetch(`https://api.unsplash.com/photos/random?client_id=${accessKey}`)
  .then(response => response.json())
  .then(data => {
    console.log(data);
  });

APIアクセスキーとは?仕組みと役割

APIアクセスキー(API Access Key)とは、外部サービスのAPI(Application Programming Interface)を利用する際に「あなたは誰ですか?」「使用する許可がありますか?」という認証と識別のために使われる一意の文字列です。以下のような役割があります。

APIアクセスキーの役割

役割内容
ユーザーの識別誰がリクエストを送っているのかをAPI提供者側が判別できるようにする
利用制限の管理1日◯回まで、◯秒に1回などの**利用回数制限(レートリミット)**に使う
セキュリティ不正利用を防ぐため、アクセスキーがある人だけが使える仕組みにする
請求の計算有料APIの場合、どれだけ使ったかをこのキーで紐づけて課金されることも

APIの取得方法(一般的な流れ)

  1. API提供元(例:Unsplash, OpenWeather, Googleなど)の開発者サイトに登録
  2. アプリやプロジェクトを作成
  3. 発行された「APIキー」をコピーしてコードに貼り付け

アクセスキーは他人に見せないこと!(不正利用される恐れあり)が大事です。

見本のスライドショーをAPIを使って作成してみよう

APIのアクセスキーを取得して自動スライドショーを作成

<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="UTF-8" />
    <title>自動スライドショー(async/await)</title>
    <style>
        body {
            font-family: sans-serif;
            text-align: center;
            padding: 20px;
        }

        #photoArea {
            width: 1200px;
            height: 800px;
            margin: 20px auto;
        }

        #photoArea img {
            max-width: 80%;
            aspect-ratio: 16 / 9;
            height: auto;
            object-fit: cover;
            opacity: 0;
            transition: opacity 3s ease-in-out;
            transform: scale(1.05);
        }

        #photoArea img.fade-in {
            opacity: 1;
            transform: scale(1);
        }
    </style>
</head>

<body>
    <h1>Unsplash画像スライドショー</h1>
    <div id="photoArea"></div>

    <script>
        const photoArea = document.getElementById('photoArea');
        const accessKey = 'UnsplashのAPIキーを入力';
        const initialKeyword = 'coffee';

        let images = [];
        let currentIndex = 0;
        let intervalId = null;

        function showImage() {
            if (images.length === 0) return;
            const img = document.createElement('img');
            img.src = images[currentIndex];
            img.alt = `Image ${currentIndex + 1}`;
            photoArea.innerHTML = '';
            photoArea.appendChild(img);
            setTimeout(() => {
                img.classList.add('fade-in');
            }, 100);
            currentIndex = (currentIndex + 1) % images.length;
        }

        async function startSlideshow(keyword) {
            if (intervalId) clearInterval(intervalId);
            try {
                const response = await fetch(`https://api.unsplash.com/search/photos?query=${encodeURIComponent(keyword)}&per_page=10&client_id=${accessKey}`);
                const data = await response.json();

                images = data.results.map(item => item.urls.regular);
                currentIndex = 0;

                if (images.length === 0) {
                    photoArea.innerHTML = '<p>画像が見つかりませんでした。</p>';
                    return;
                }

                showImage(); // 最初の画像表示
                intervalId = setInterval(showImage, 4000); // 3秒ごとに切り替え

            } catch (error) {
                console.error('取得エラー:', error);
                photoArea.innerHTML = '<p>画像の取得に失敗しました。</p>';
            }
        }

        window.addEventListener('DOMContentLoaded', () => {
            startSlideshow(initialKeyword);
        });
    </script>
</body>

</html>