入れ子になったデータを扱う
複雑な構造を扱います。
「入れ子になったデータを扱う」はCoddyKit上の無料Lua Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLua Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Lua Academyコースには全4レッスンが含まれています。
ネストされたデータはいたるところにある
現実世界のJSONがフラットな構造であることは、ほとんどありません。オブジェクトがオブジェクトを含み、配列がオブジェクトを含むなど、何階層にも深くネストされていることがよくあります。
Luaでは、これはテーブルの中にテーブルがあるということです。幸い、decodeとencodeはネストを自動的に処理します。
オブジェクトの中のオブジェクト
JSONの値自体がオブジェクトの場合、それはネストされたLuaのテーブルにデコードされます。フィールドアクセスを連結して、目的のデータまでたどれます。
local json = require("dkjson")
local d = json.decode('{"user": {"name": "Eve", "age": 30}}')
print(d.user.name)
print(d.user.age)オブジェクトの配列
JSON配列の中にオブジェクトが並ぶ形式は、レコードのリストのように非常によく使われます。これはテーブルのシーケンスにデコードされます。
ipairsでループし、それぞれの項目からフィールドを読み取ってください。
local json = require("dkjson")
local d = json.decode('[{"id":1},{"id":2}]')
for _, item in ipairs(d) do
print(item.id)
end深くネストされたデータへのアクセス
データの深さに応じて、どこまでもアクセスを連結できます。各階層は、別のテーブル検索にすぎません。
ただし途中の階層が1つでも存在しない場合、連結したアクセスは'attempt to index a nil value'というエラーになります。
local json = require("dkjson")
local d = json.decode('{"a":{"b":{"c": 42}}}')
print(d.a.b.c)安全なネストデータへのアクセス
存在しない階層によるクラッシュを避けるには、各段階を確認するか、andの短絡評価を使用します。
andの連結は最初のnilで停止し、エラーにせずnilを返します。
local json = require("dkjson")
local d = json.decode('{"a":{}}')
local c = d.a and d.a.b and d.a.b.c
print(c) -- nil, no crashネストされた配列の反復処理
配列がオブジェクトを含み、そのオブジェクトがさらに配列を含むこともあります。構造に合わせてループをネストしてください。
local json = require("dkjson")
local d = json.decode('[{"tags":["a","b"]}]')
for _, rec in ipairs(d) do
for _, tag in ipairs(rec.tags) do
print(tag)
end
endネストされたテーブルの構築
ネストされたJSONをエンコードするには、Luaのテーブルをそのままネストします。エンコーダーが構造全体を再帰的にたどります。
local json = require("dkjson")
local t = {
user = { name = "Jo", roles = { "admin", "editor" } }
}
print(json.encode(t, { indent = true }))ネストされた値の変更
再エンコードする前であれば、どの深さのフィールドでも読み取り、変更、追加できます。これがデータ変換の中心となる処理です。
local json = require("dkjson")
local d = json.decode('{"cfg":{"volume":5}}')
d.cfg.volume = 8
d.cfg.muted = false
print(json.encode(d))配列とオブジェクトの混在
JSONでは、異なる階層に配列とオブジェクトを自由に組み合わせられます。Luaでも、シーケンステーブルとキー付きテーブルを入れ子にして同じ構造を表現できます。
ただし、それぞれのテーブルが一貫してどちらか一方の形式になるようにしてください。
local json = require("dkjson")
local t = {
team = "red",
members = { { id = 1 }, { id = 2 } }
}
print(json.encode(t))構造が不明なデータの走査
あらかじめ構造がわからない場合は、type()で各値を調べ、テーブルに対して再帰処理を行います。
これにより、任意のJSONに対応する汎用プロセッサーを作成できます。
local function walk(v)
if type(v) == "table" then
for k, sub in pairs(v) do walk(sub) end
else
print(v)
end
endネスト内のnullに注意
ネストされたデータの奥にあるnullも、dkjsonではjson.nullにデコードされます。構造を走査するときに実際のテーブルや値と間違えないよう、これを考慮してください。
local json = require("dkjson")
local d = json.decode('{"a":{"b": null}}')
if d.a.b == json.null then
print("b is null")
end理解度チェック
LuaでネストされたJSONを扱う方法について理解できているか確認しましょう。
まとめ
ネストされたJSONは、テーブルの中にあるテーブルとして表現されます。decodeとencodeが再帰処理を自動的に行います。
フィールドアクセスを連結してデータをたどれますが、andの連結を使って存在しない階層に備えてください。Luaのテーブルをネストしてネストされた出力を構築し、どの深さでもnullと配列・オブジェクトの違いを忘れないようにしましょう。
よくある質問
「入れ子になったデータを扱う」レッスンは無料ですか?
はい。「入れ子になったデータを扱う」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Lua Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Lua Academyコースには全4レッスンが含まれています。
「入れ子になったデータを扱う」で何を学びますか?
複雑な構造を扱います。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Lua Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLua Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「入れ子になったデータを扱う」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLua Academyレッスンでコードを書いて実行できますか?
はい。すべてのLua Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- JSONを使う理由
- JSONをテーブルにデコードする
- テーブルをJSONにエンコードする
- 入れ子になったデータを扱う