0Pricing
Lua Academy · レッスン

入れ子になったデータを扱う

複雑な構造を扱います。

「入れ子になったデータを扱う」は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フィードバックを取得できます。ローカル設定は不要です。

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

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