【JavaScript】JSONファイルの読み込み方

JavaScriptでJSONファイルを読み込む方法はいくつかありますが、環境(ブラウザ / Node.js)と読み込み方で正解が変わります。古い記事には非推奨の手法や廃止された構文も混ざっているので注意が必要です。

この記事では、ブラウザでの fetchimport、Node.jsでの方法を、現在の正しいやり方で解説します。

この記事の結論:ブラウザは fetchawait response.json() が基本です。ローカルのJSONはサーバー経由でないと読めませんfile://では失敗)。import で読むなら with { type: "json" }(古い assert は廃止)、Node.jsは fs/promisesrequire を使います。同期XHRは使いません
スポンサーリンク

fetchで読み込む(async/await)

ブラウザでの基本は fetch です。.then() でもよいですが、async/await のほうが読みやすく、エラー処理も try/catch でまとめられます。

JavaScript:fetch+async/await
async function loadJSON(url) {
  const response = await fetch(url);
  if (!response.ok) {
    throw new Error(`HTTP ${response.status}`); // 404などを検知
  }
  return response.json(); // JSONとしてパース
}

try {
  const data = await loadJSON("data.json");
  console.log(data);
} catch (error) {
  console.error("JSONの読み込みに失敗:", error);
}

response.ok の確認は重要です(fetch は404でも例外を投げず、okfalse になるだけ)。fetch の基本はfetch APIで非同期通信を行うasync/awaitPromiseとasync/awaitの使い方を参照してください。

ローカルファイルはサーバー経由で(file://の注意)

よくあるつまずき:HTMLファイルをダブルクリックで直接開くfile://)と、fetch("data.json")セキュリティ制限で失敗します(「Failed to fetch」「CORS」エラー)。ローカルで動かすには簡易サーバー経由でアクセスしてください。

簡易サーバーは次のように立てられます(プロジェクトのフォルダで実行)。

ターミナル:ローカルサーバーを立てる例
# Node.js(npx)
npx serve

# Python
python -m http.server

# VS Code なら拡張機能「Live Server」も手軽

importで読み込む(with { type: “json” })

ESモジュール環境では、JSONを直接 import できます。現在の標準は with { type: "json" }(import attributes)です。

JavaScript:JSONをimport
// 現在の標準(import attributes)
import data from "./data.json" with { type: "json" };

console.log(data);
古い assert は使わない:かつての assert { type: "json" }非推奨で、Node.js 22 では削除されました。必ず with を使ってください。なお対応環境は限られる(モダンブラウザ・新しいNode.js)ため、幅広く動かすなら fetch やビルドツールでの読み込みが無難です。

Node.jsで読み込む(fs / require)

Node.js環境では、ファイルシステムから直接読み込めます。fs/promisesreadFileJSON.parse が基本です。

JavaScript:Node.jsでの読み込み
// ESM: fs/promises + JSON.parse
import { readFile } from "node:fs/promises";

const text = await readFile("./data.json", "utf-8");
const data = JSON.parse(text);

// CommonJS なら require でそのまま読める
// const data = require("./data.json");

取得したJSONをブラウザのローカルに保存したい場合はlocalStorageの使い方(JSON保存の章)も参考になります。

同期XHRは使ってはいけない

古い記事では XMLHttpRequest同期で使う方法を見かけますが、使ってはいけません

JavaScript:同期XHR(NG)
// NG: 第3引数 false = 同期。メインスレッドを止めるため非推奨
const xhr = new XMLHttpRequest();
xhr.open("GET", "data.json", false);
xhr.send(null);
なぜダメか:同期XHRは読み込みが終わるまでページ全体の操作が固まり、ブラウザも警告を出します(廃止の方向)。JSONの読み込みは fetchawait非同期に行うのが正解です。

よくある質問(FAQ)

QJavaScriptでJSONファイルを読み込むには?
Aブラウザでは const data = await (await fetch("data.json")).json() のようにfetchresponse.json() で取得・パースします。Node.jsでは fs/promisesreadFileJSON.parse、または require() が使えます。
Qfetchで「Failed to fetch」になるのはなぜ?
AHTMLを file:// で直接開いていると、ローカルファイルへの fetch はセキュリティ制限で失敗します。npx servepython -m http.server などでローカルサーバー経由でアクセスしてください。
Qimport assert { type: “json” } が動かないのですが?
Aassert は廃止され、Node.js 22 で削除されました。現在は import data from "./data.json" with { type: "json" } のようにwith を使います(import attributes)。
QJSONのパースに失敗した場合の対処は?
Atry-catchJSON.parse()(や response.json())をラップし、SyntaxError をキャッチします。fetch では response.ok の確認も必要です。

まとめ

JSONファイルの読み込みは、ブラウザなら fetchawait response.json()Node.jsなら fs/promisesJSON.parserequireが基本です。

ローカルファイルは file:// では読めずサーバー経由が必要、importwith { type: "json" }assert は廃止)、そして同期XHRは使わない——この3点を押さえれば、現在の環境で正しく読み込めます。