0Pricing
Lua Academy · 课时

处理嵌套数据

处理复杂结构。

处理嵌套数据 是 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 为什么使用 JSON
  2. 将 JSON 解码为表
  3. 将表编码为 JSON
  4. 处理嵌套数据
← 返回 Lua Academy