WebサイトにJSONを読み込んで、その値の分だけカード型UIを表示させる方法[JavaScript, JSON]

WebサイトにJSONをJavaScriptで読み込んで、その値の分だけカード型UIを表示させる方法[JavaScript, JSON]

Webサイトに、外部JSONを読み込む基本的な方法

以前、

「静的なページにJSONファイルを素のJavaScriptで読み込んで、その内容を forEach() や map() でループとして展開する」

という様な案件に携わったことがあり、けっこう覚えておくと役立ちそうな方法だったので、本日はそれについての記事を書きます。

コードなど。まずはサンプルのJSON

まずは、サンプルのJSONです。
これを外部ファイル rabbits.json として保存してあるとします。
かわいいうさぎのプロフィールが7匹分、入っているデータです。

{
  "rabbits": [
    {
      "type": "ネザーランドドワーフ",
      "name": "マカロン",
      "favorite": "ニンジン",
      "age": 1
    },
    {
      "type": "ホーランドロップ",
      "name": "プリン",
      "favorite": "バナナ",
      "age": 3
    },
    {
      "type": "ライオンヘッド",
      "name": "ショコラ",
      "favorite": "キャベツ",
      "age": 2
    },
    {
      "type": "フレンチロップ",
      "name": "キャンディ",
      "favorite": "ブロッコリー",
      "age": 3
    },
    {
      "type": "ドワーフホト",
      "name": "マシュマロ",
      "favorite": "イチゴ",
      "age": 1
    },
    {
      "type": "ジャージーウーリー",
      "name": "ラテ",
      "favorite": "パセリ",
      "age": 3
    },
    {
      "type": "アメリカンファジーロップ",
      "name": "カプチーノ",
      "favorite": "トウモロコシ",
      "age": 2
    }
  ]
}

続いてhtml

htmlは、ただ表示するだけなら、ターゲットとなるdivタグを1個置いておけば良いです。
JavaScriptで動的にhtml要素を生成して、そこにJSONの値を入れて、
このdiv要素に後で差し込むわけです。

<div class="card-container"></div>

JavaScriptでJSONを読み込み、html要素を生成、そこにJSONの値を入れます

これが今回の記事の主要な部分になります。

まず最初の関数 getJSON() で外部JSONファイルを読み込みます。

読み込めたら、先ほど上のセクションで書いたdivタグの中に、要素の分だけ
カードとして情報を表示してあげたいので、
それ用の関数 createCard() も用意しておきます。

getJSON()末尾で、読み込んだJSONを
カード生成用の関数 createCard() に値として渡してあげることで、
カード生成用の関数 createCard() の中でJSONが持つ各値を参照することができます。

<script>
// 外部JSONを読込
async function getJSON() {
  const targetJSON = await fetch("./json/rabbits.json");
  const resultJSON = await targetJSON.json();
  createCard(resultJSON);
}

// カード生成用
function createCard(j) {
  const rabbitsArray = j.rabbits;
  const cardContainer = document.getElementById("card-container");

  rabbitsArray.forEach((d) => {
    const myCard = document.createElement("div");
    const myCardTitle = document.createElement("h3");
    const myCardType = document.createElement("p");
    const myCardFood = document.createElement("p");
    const myCardAge = document.createElement("p");

    myCard.classList.add("card-item");

    myCardTitle.textContent = d.name;
    myCardType.textContent = `うさぎの種類: ${d.type}`;
    myCardFood.textContent = `好きな食べ物: ${d.favorite}`;
    myCardAge.textContent = `年齢: ${d.age}`;

    myCard.appendChild(myCardTitle);
    myCard.appendChild(myCardType);
    myCard.appendChild(myCardFood);
    myCard.appendChild(myCardAge);

    // 対象のhtmlに、生成した要素を appendChild() で差し込む
    cardContainer.appendChild(myCard);
  });
}

// ページがロードされたらJSON取得の関数を呼出す事で動作させる
window.onload = getJSON();
</script>

続いてcss。これはお好みで

続いて、cssになります。
タイトルの通り、 cssに関しては本当にお好みで、自由です。

サンプルとして、1000pxのコンテナ内に
1行に3枚ずつ、うさちゃんの情報が載っているカードが出る様な見た目にしました。

.card-container {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  margin: 2rem auto;
  width: 1000px;
}
.card-item {
  border-radius: 5px;
  box-shadow: 0 0 3px rgba(0, 0, 0, 0.3);
  box-sizing: border-box;
  font-family: "Hiragino Kaku Gothic ProN", "Hiragino Sans", Meiryo, sans-serif;
  padding: 10px;
  text-align: center;
  width: calc((100% - 20px) / 3);
}
.card-item h3 {
  font-size: 1.25rem;
}
.card-item p {
  font-size: 0.75rem;
}

留意点:サンプルが動かない場合

単純に、この記事のサンプルをhtmlに貼り付けて試してみようとしても、

貼り付けたhtmlをそのままブラウザで開くだけでは
ブラウザが持っているセキュリティ機能がはたらくため(「CORS」エラーが出る)
動きません。

・サーバーにアップして試してみる
・localサーバーを立ち上げる(これは、gulpを使ったり色々な方法があり検索すればすぐ出るため、この記事では割愛します)
・Safariで開き、「設定 > デベロッパー」から、一時的にクロスオリジンに関する項目を止めてリロード

などの方法で試してみることができます。

JSONの外部読み込みに関して、MDNでの記事など

もはやWeb制作をする際のマニュアルと言っても過言ではないレベルの
リファレンスサイトである「MDN」(運営:mozilla)には、
この記事でご紹介している様な、静的htmlから外部JSONを読み込むサンプルが紹介されています。

JSONの操作 — Web開発を学ぶ | MDN
↑こちらでは、うさぎのプロフィール情報ではなく、スーパーヒーローのJSONを読み込む方法について、
とてもわかりやすいサンプルが掲載されています。一読をおすすめします。

この記事のまとめ

なにかWebサイトを作るとき、

・プレーンなhtml
・CSS

だけの構成でとりかかると、コードは長くなりがちです。

それは、「繰り返し」ができるUIパーツについても、全て記述しなければならないからです。

例えば、あるセクション内で、今回の記事のサンプルの様に
「7枚のカード型UIが並ぶレイアウト」があったとします。このとき

・プレーンなhtml
・CSS

だけの構成の場合、7枚カードがあるならば7枚分、
「同じclass名がついた、カード型UIを構成するhtml要素が7個」、そのhtmlファイル内に存在してしまう事になります。

そこで、効率化を図るため、実案件では

・Vue.js や React 等、フロントエンドフレームワークを用いる方法
だったり、

せめて
・pug(旧Jade)のようなプリプロセッサを入れ工夫をするアプローチ

が実際の制作現場でとられています。

ただし案件によっては、それらのフロントエンドフレームワークの使用ができないケースもあったりします。

そこで今回の記事を書いたわけですが、

単純に「見た目」と「コンテンツ」を分離して効率化するだけなら、

・プレーンなhtml
・CSS
・コンテンツは「JSON」形式で外部に用意してJavaScriptで読み込む

というアプローチで、効率化を実現することが可能です。

この記事の様に、
・ガワ(見た目)のみhtml/cssに持たせる
・コンテンツは外部ファイルとして分ける

と言った方法をとると、
「擬似的にフロントエンドフレームワークを入れた様なアプローチ」を、静的サイトの場合もすることができる、
というわけです。

この記事が皆さんのより良いWeb制作体験につながれば、嬉しく思います。

※この記事は内容の品質向上を目的に、随時更新を行う場合があります。

この記事をシェアする: