アットウィキロゴ

JSON

PlaydateにおけるJSON(JavaScript Object Notation)は、ゲームデータのセーブ、設定ファイルの保存、あるいはレベルデータの管理などにおいて、最も標準的かつ軽量なデータ形式として利用されています。
Playdate SDKのコア言語であるLuaには標準でJSONライブラリが含まれていませんが、Playdate SDKが非常に強力で高速な playdate.datastore (データストア) を提供しているため、開発者はこれを利用するのが一般的です。


概要

1. PlaydateにおけるJSONの基本
Playdateでは、Luaのテーブル(Table)とJSONファイルを相互に変換して処理します。

Lua Table
ゲーム内で扱うデータ構造(配列や連想配列)。
JSON
ファイルとして保存・読み込みするためのテキスト形式。

主要な関数として、SDKの playdate.datastore モジュールを使用します。
カテゴリ 関数 説明
データストア playdate.datastore.write(table, [filename]) テーブルをJSONとしてデータフォルダに保存
playdate.datastore.read([filename]) JSONファイルを読み込み、Luaテーブルに変換
JSONのパース json.encode(table) テーブルをJSON文字列に変換(ファイル書き出しはしない)
json.decode(string) JSON文字列をテーブルに変換

2. データの保存と読み込み(実践)
Playdateでのセーブデータ管理の典型的な流れは以下の通りです。
データの保存(Write)
playdate.datastore.write() を使うと、自動的に .json 拡張子が補完され、デバイス内のゲーム専用データ領域に保存されます。
local gameData = {
    playerName = "Hero",
    level = 5,
    highScore = 1200,
    items = {"Sword", "Shield", "Potion"}
}
 
-- "saveData.json" という名前で保存
playdate.datastore.write(gameData, "saveData")
データの読み込み(Read)
保存されたデータがない場合は nil を返すため、初期値の設定(デフォルト値)を考慮するのがコツです。
local loadedData = playdate.datastore.read("saveData")
 
if loadedData then
    print(loadedData.playerName) -- "Hero"
else
    -- ファイルが存在しない場合の初期処理
    print("No save data found.")
end

3. Playdate特有の注意点
ファイルの保存場所
セキュリティと管理の都合上、読み書きできる場所は限定されています。
  • シミュレータ: Documents/PlaydateSDK/Disk/Data/<BundleID>/
  • 実機: 各ゲーム専用のサンドボックス内
型の変換(Lua ↔ JSON)
LuaとJSONではデータ構造に少し差異があるため、変換時に注意が必要です。
  • 空のテーブル: Luaの {} は、JSONでは [] (配列) になるか {} (オブジェクト) になるか文脈に依存します
  • インデックス: Luaは 1 から始まりますが、JSON(および他言語)は 0 から始まるのが一般的です。SDKが適切にラップしてくれますが、外部ツールで作成したJSONを読み込む際は構造を確認してください
高速なエンコード/デコード
playdate.datastore はC言語レベルで最適化されているため、純粋なLuaスクリプトでJSONをパースするよりも遥かに高速です。
大きなレベルデータ(マップタイルなど)を扱う場合も、極力SDK標準の関数を使うことが推奨されます。

4. 外部JSONファイルの利用
外部ツール(Tiled Map Editorなど)から書き出したJSONを読み込みたい場合は、 playdate.datastore.read() ではなく、プロジェクト内にリソースとして含めた上で読み込みます。
Tips
読み取り専用のリソースとしてJSONを扱う場合は、 playdate.file.open() でファイルを開き、 json.decode() に渡す処理が必要になる場合があります。

関連ページ

最終更新:2026年04月30日 07:54