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制作体験につながれば、嬉しく思います。
※この記事は内容の品質向上を目的に、随時更新を行う場合があります。