将 JSON 解码为表
解析 JSON 字符串。
将 JSON 解码为表 是 CoddyKit 上的免费 Lua Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 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 数组的索引从 1 开始,而不是从 0 开始。
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)三个返回值
dkjson 的 decode 最多返回三个值:解码结果、解析停止的位置,以及错误消息。
成功时结果为非 nil;失败时结果为 nil,第三个值会说明失败原因。
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
endcjson 的差异
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 解码为表」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Lua Academy 课程的其余内容,请升级到 CoddyKit PRO。 Lua Academy 课程共包含 4 节课。
「将 JSON 解码为表」这节课中我会学到什么?
解析 JSON 字符串。 你通过在浏览器中直接运行的动手代码来练习 Lua Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Lua Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Lua Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「将 JSON 解码为表」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Lua Academy 课中编写并运行代码吗?
能。每节 Lua Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 为什么使用 JSON
- 将 JSON 解码为表
- 将表编码为 JSON
- 处理嵌套数据