まくろぐ
更新: / 作成:

Deno で JSON ファイルを読み込んで、JavaScript のオブジェクトとして参照できるようにするには、import で直接インポートする方法と、Deno.readTextFile で読み込んでから JSON.parse する方法があります。 ここでは、それぞれの方法で次のような JSON ファイルを読み込んでみます。

books.json
[
  {"title": "Title 1", "author": "Author 1"},
  {"title": "Title 2", "author": "Author 2"},
  {"title": "Title 3"}
]

JSON モジュールとしてインポートする方法

Deno では、import 文で JSON ファイルを直接インポートできるようになっています。 JSON ファイルをインポートするときは、import assertions の機能を使って、JSON ファイルであることを明示する必要があります。

import 文で静的インポート

main.ts
import books from "./books.json" assert { type: "json" };

for (const b of books) {
  console.log(`title: ${b.title}, author: ${b.author ?? "Unknown"}`);
}
実行例
$ deno run main.ts
title: Title 1, author: Author 1
title: Title 2, author: Author 2
title: Title 3, author: Unknown

この方法では JSON ファイルが静的に読み込まれるため、次のような恩恵があります。

  • JSON データから TypeScript の型情報を推測してくれるので、VS Code などで入力補完が効きます。
  • deno run でのプログラム実行時に、--allow-read を付加する必要がありません。

import 関数で動的インポート

import 文の代わりに import 関数を使うと、動的に JSON ファイルを読み込むことができます。

main.ts
async function loadBooks() {
  const { default: books } = await import("./books.json", {
    assert: { type: "json" },
  });
  return books;
}

const books = await loadBooks();

ただし、動的に読み込む場合は、プログラムの実行時に --allow-read フラグが必要です。

$ deno run --allow-read main.ts

URL で JSON ファイルを指定する

Web 上で公開されている JSON ファイルを URL で指定してインポートすることもできます。 次の例では、気象庁が公開している東京 (=130000) の天気予報を取得しています。

main.ts
import forecast from "https://www.jma.go.jp/bosai/forecast/data/overview_forecast/130000.json" assert { type: "json" };

console.log(forecast.targetArea);
console.log(forecast.reportDatetime);
console.log(forecast.text.split("\n", 1)[0]);
実行例
$ deno run main.ts
東京都
2022-12-28T16:39:00+09:00
 日本付近は、日本の南に中心を持つ高気圧に覆われています。一方、三陸沖には低気圧があって東北東へ進んでいます。

初期状態では TypeScript の型情報が認識されませんが、一度プログラムを実行するか、次のように deno cache コマンドで明示的に JSON ファイルをキャッシュすることで補完が効くようになります。

$ deno cache https://www.jma.go.jp/bosai/forecast/data/overview_forecast/130000.json

Deno.readTextFile で読み込む方法

Deno API の Deno.readTextFile で JSON ファイルを通常のテキストファイルとして読み込んでから、JSON.parse でパースする方法です。 JSON.parse の戻り値は any 型なので、TypeScript の型情報は自分で定義する必要があります。

main.ts
// JSON テキストを JavaScript オブジェクトに変換するときの型情報
type Book = {
  title: string;
  author?: string;
};

const jsonText = await Deno.readTextFile("./books.json");
const books = JSON.parse(jsonText) as Book[];

for (const b of books) {
  console.log(`title: ${b.title}, author: ${b.author ?? "Unknown"}`);
}

動的に JSON ファイルを読み込むので、プログラムの実行時に --allow-read フラグの指定が必要です。

実行例
$ deno run --allow-read main.ts
title: Title 1, author: Author 1
title: Title 2, author: Author 2
title: Title 3, author: Unknown

関連記事

まくろぐ
サイトマップまくへのメッセージ