0Pricing
Lua Academy · レッスン

テーブルをJSONにエンコードする

Luaのデータをシリアライズします。

「テーブルをJSONにエンコードする」はCoddyKit上の無料Lua Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLua Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Lua Academyコースには全4レッスンが含まれています。

エンコードの基本

エンコードはデコードの逆で、LuaテーブルをJSON文字列に変換します。json.encode(table) を呼び出してください。

返されるのは1行の文字列で、ファイルに書き込んだりネットワーク経由で送信したりできます。

local json = require("dkjson")
local t = { name = "Leo", age = 9 }
print(json.encode(t))

オブジェクトと配列の違い

Luaテーブルがどのようにエンコードされるかは、キーによって決まります。1から始まる連続した整数キーを持つテーブルは、JSON配列になります。

文字列キーを持つテーブルはJSONオブジェクトになります。キーが混在するテーブルは曖昧になるため、避けてください。

local json = require("dkjson")
print(json.encode({ 1, 2, 3 }))        -- [1,2,3]
print(json.encode({ a = 1, b = 2 }))   -- {"a":1,"b":2}

整形出力

JSONはデフォルトではコンパクトな形式です。dkjsonでは、indent = trueを指定したオプションテーブルを渡すことで、読みやすいように出力をインデントできます。

整形された出力は、人が編集する設定ファイルに適しています。

local json = require("dkjson")
local t = { name = "Ann", roles = { "dev", "lead" } }
print(json.encode(t, { indent = true }))

数値と真偽値のエンコード

Luaの数値と真偽値は、それぞれ対応するJSONの値に直接エンコードされます。整数と浮動小数点数は、どちらもJSONの数値になります。

local json = require("dkjson")
local t = { count = 5, ratio = 1.5, active = true }
print(json.encode(t))

nilの問題

テーブルにnilを格納してJSONのnullを表すことはできません。nilを代入すると、キー自体が完全に削除されるためです。

リテラルのnullを出力するには、値としてライブラリのセンチネルであるjson.nullを使用します。

local json = require("dkjson")
local t = { middle = json.null }
print(json.encode(t))  -- {"middle":null}

疎な配列で起こる問題

シーケンスに欠落がある場合(たとえばインデックス2がnilの場合)、Luaはそれを正常な配列として扱わなくなります。エンコードが欠落箇所で止まったり、予期しない動作をしたりする可能性があります。

予測可能なJSON配列にするには、配列のインデックスを1から始めて連続させてください。

local json = require("dkjson")
local t = { [1] = "a", [3] = "c" }  -- gap at 2
print(json.encode(t))               -- unreliable

JSONをファイルに書き込む

データを永続化するには、テーブルを文字列にエンコードし、その文字列をファイルに書き込みます。

これにより、設定、スコア、その他の構造化された状態を保存できます。

local json = require("dkjson")
local data = { theme = "dark", volume = 8 }
local f = io.open("settings.json", "w")
f:write(json.encode(data, { indent = true }))
f:close()

空のテーブルはデフォルトでオブジェクトになる

空のLuaテーブル{}にはキーがないため、dkjsonはデフォルトで空の配列ではなく空のオブジェクト{}としてエンコードします。

空の配列が必要な場合、dkjsonではテーブルにタグを付けられます。そうしないと、型を判別できないためです。

local json = require("dkjson")
print(json.encode({}))  -- {}

キーの順序は保証されない

Luaのテーブルでは、文字列キーに固有の順序がありません。そのため、エンコードされたJSONのフィールド順序は変わる可能性があります。

フィールドの順序に依存しないでください。JSONの利用側では、位置ではなく名前でキーを検索するべきです。

ラウンドトリップの一貫性

エンコードしてからデコードすると、同等のテーブルが得られるはずです。このラウンドトリップは、データ処理をテストする良い方法です。

local json = require("dkjson")
local orig = { a = 1, list = { 2, 3 } }
local copy = json.decode(json.encode(orig))
print(copy.a, copy.list[2])

cjsonでのエンコード

lua-cjsonにもencodeが用意されています。こちらは高速ですが、書式設定のオプションが少なく、エラーを返す代わりに発生させます。

インデントされた整形出力が必要な場合は、通常、dkjsonのほうが扱いやすい選択肢です。

local cjson = require("cjson")
local s = cjson.encode({ ok = true, n = 42 })
print(s)

理解度チェック

Luaのテーブルのエンコードについて理解できているか確認しましょう。

まとめ

エンコードすると、LuaのテーブルがJSON文字列に変換されます。整数キーのシーケンスは配列になり、文字列キーのテーブルはオブジェクトになります。

リテラルのnullにはjson.nullを使用し、配列のインデックスは連続させ、読みやすい出力にはindent = trueを渡してください。次は、深くネストされたデータを扱います。

よくある質問

「テーブルをJSONにエンコードする」レッスンは無料ですか?

はい。「テーブルをJSONにエンコードする」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Lua Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Lua Academyコースには全4レッスンが含まれています。

「テーブルをJSONにエンコードする」で何を学びますか?

Luaのデータをシリアライズします。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Lua Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのLua Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「テーブルをJSONにエンコードする」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このLua Academyレッスンでコードを書いて実行できますか?

はい。すべてのLua Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. JSONを使う理由
  2. JSONをテーブルにデコードする
  3. テーブルをJSONにエンコードする
  4. 入れ子になったデータを扱う
← Lua Academyに戻る