处理嵌套数据
处理复杂结构。
处理嵌套数据 是 CoddyKit 上的免费 Lua Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 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深层嵌套访问
数据有多深,您就可以连续访问到多深。每一层都只是另一次表查找。
但是,如果中间的任何一层缺失,连续访问就会因“尝试索引 nil 值”而出错。
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 }))修改嵌套值
您可以在重新编码之前,在任意深度读取和修改字段,并使用 add 添加新字段。这正是转换数据的核心。
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 以及数组与对象的区别。
常见问题解答
「处理嵌套数据」课时是免费的吗?
是的 — 「处理嵌套数据」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Lua Academy 课程的其余内容,请升级到 CoddyKit PRO。 Lua Academy 课程共包含 4 节课。
「处理嵌套数据」这节课中我会学到什么?
处理复杂结构。 你通过在浏览器中直接运行的动手代码来练习 Lua Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Lua Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Lua Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「处理嵌套数据」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Lua Academy 课中编写并运行代码吗?
能。每节 Lua Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。