0Pricing
Lua Academy · 课时

将 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
end

cjson 的差异

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 反馈 — 无需本地设置。

此课程中的所有课时

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