テーブルを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)) -- unreliableJSONをファイルに書き込む
データを永続化するには、テーブルを文字列にエンコードし、その文字列をファイルに書き込みます。
これにより、設定、スコア、その他の構造化された状態を保存できます。
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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- JSONを使う理由
- JSONをテーブルにデコードする
- テーブルをJSONにエンコードする
- 入れ子になったデータを扱う