JSONをテーブルにデコードする
JSON文字列を解析します。
「JSONをテーブルにデコードする」はCoddyKit上の無料Lua Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLua Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Lua Academyコースには全4レッスンが含まれています。
デコードの基本
デコードは、JSON文字列を処理可能なLuaの値に変換します。入口となるのは json.decode(text) です。
JSONの最上位がオブジェクトの場合は文字列キーを持つLuaテーブルになり、配列の場合は数値インデックスを持つテーブルになります。
local json = require("dkjson")
local data = json.decode('{"id": 7}')
print(data.id)オブジェクトのフィールドを読む
デコードされたJSONオブジェクトは、通常のLuaテーブルと同じように扱えます。ドット記法または角括弧記法で値にアクセスします。
スペースを含むキーなど、Luaの識別子として有効でないキーには角括弧記法が必要です。
local json = require("dkjson")
local u = json.decode('{"name": "Mia", "full name": "Mia Lee"}')
print(u.name)
print(u["full name"])配列をデコードする
JSON配列は、1から始まるインデックスを持つLuaのシーケンステーブルにデコードされます。ipairs または数値ループで反復処理します。
Luaの配列は0ではなく、1から始まることを覚えておいてください。
local json = require("dkjson")
local nums = json.decode('[10, 20, 30]')
for i, v in ipairs(nums) do
print(i, v)
end数値と真偽値
JSONの数値はLuaの数値にデコードされ、JSONの true と false はLuaの真偽値にデコードされます。
デコードした後は、算術演算や条件分岐でそのまま使用できます。
local json = require("dkjson")
local d = json.decode('{"qty": 3, "paid": false}')
if not d.paid then
print("unpaid, qty =", d.qty)
endnullの扱い
JSONの null は、Luaの nil がテーブルからキーを削除するため、扱いに注意が必要です。ライブラリによって処理方法も異なります。
dkjson は null を特別な値である json.null にデコードするため、キーが存在し続けます。nullかどうかを判定するには、この値と比較します。
local json = require("dkjson")
local d = json.decode('{"mid": null}')
if d.mid == json.null then
print("mid is null")
endファイルからデコードする
JSONがファイルに保存されていることはよくあります。ファイル全体を文字列として読み込み、その後でデコードします。
これは設定や保存したゲーム状態を読み込む際によく使われるパターンです。
local json = require("dkjson")
local f = io.open("config.json", "r")
local text = f:read("*a")
f:close()
local cfg = json.decode(text)
print(cfg.theme)3つの戻り値
dkjson の decode は、デコード結果、解析が停止した位置、エラーメッセージの最大3つの値を返します。
成功時は結果がnil以外になり、失敗時はnilになって、3番目の値に理由が示されます。
local json = require("dkjson")
local obj, pos, err = json.decode('{"a":1}')
print(obj.a, pos, err)入力を検証する
外部から受け取ったJSONを決して無条件に信頼しないでください。形式が不正なデータによってプログラムがクラッシュしないよう、使用前に必ず結果を確認します。
local json = require("dkjson")
local function safeDecode(s)
local v, _, err = json.decode(s)
if not v then return nil, err end
return v
endcjsonとの違い
lua-cjson も同様に動作しますが、不正な入力を返り値で知らせる代わりにエラーを発生させます。安全に扱うには pcall でラップしてください。
cjson はより高速なため、大量のデータを解析する場合に重要になります。
local cjson = require("cjson")
local ok, data = pcall(cjson.decode, '{"x":1}')
if ok then print(data.x) else print("error") end存在しないキーはnilになる
JSONに存在しないキーを読み取ると、Luaは単に nil を返します。これは通常の動作であり、エラーは発生しません。
任意フィールドにデフォルト値を指定するには、or を使って代替値を設定します。
local json = require("dkjson")
local d = json.decode('{"name": "Sam"}')
local age = d.age or 0
print(d.name, age)空のテーブルは区別できない
空のJSONオブジェクト {} と空の配列 [] は、どちらも空のLuaテーブルにデコードされます。デコードした後では、どちらだったかを判別できません。
これは主に再エンコードするときに問題になります。データを往復変換する場合は、この曖昧さを意識してください。
理解度チェック
JSONのデコードについて学んだことを確認しましょう。
まとめ
デコードはJSONテキストをLuaテーブルに変換します。オブジェクトは文字列キーのテーブルになり、配列はインデックスが1から始まるシーケンスになります。
必ず結果を検証し、nullはライブラリの特別な値で処理してください。また、存在しないキーは単にnilになることも覚えておきましょう。次は、LuaテーブルをJSONに戻すエンコードについて学びます。
よくある質問
「JSONをテーブルにデコードする」レッスンは無料ですか?
はい。「JSONをテーブルにデコードする」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Lua Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Lua Academyコースには全4レッスンが含まれています。
「JSONをテーブルにデコードする」で何を学びますか?
JSON文字列を解析します。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Lua Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLua Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「JSONをテーブルにデコードする」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLua Academyレッスンでコードを書いて実行できますか?
はい。すべてのLua Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- JSONを使う理由
- JSONをテーブルにデコードする
- テーブルをJSONにエンコードする
- 入れ子になったデータを扱う