0Pricing
Lua Academy · レッスン

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)
end

nullの扱い

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
end

cjsonとの違い

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フィードバックを取得できます。ローカル設定は不要です。

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

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