将表编码为 JSON
序列化 Lua 数据。
将表编码为 JSON 是 CoddyKit 上的免费 Lua Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Lua Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Lua Academy 课程共包含 4 节课。
编码基础
编码是解码的逆过程:它会将 Lua 表转换为 JSON 字符串。请调用 json.encode(table)。
返回结果是一个单行字符串,您可以将它写入文件或通过网络发送。
local json = require("dkjson")
local t = { name = "Leo", age = 9 }
print(json.encode(t))对象与数组
Lua 表的编码方式取决于它的键。使用从 1 开始的连续整数键的表会被编码为 JSON 数组。
使用字符串键的表会被编码为 JSON 对象。混合类型的表含义不明确,应当避免使用。
local json = require("dkjson")
print(json.encode({ 1, 2, 3 })) -- [1,2,3]
print(json.encode({ a = 1, b = 2 })) -- {"a":1,"b":2}美化输出
默认情况下,JSON 采用紧凑格式。传入包含 indent = true 的选项表,dkjson 就会为输出添加缩进,提高可读性。
对于需要由人编辑的配置文件,美化后的输出非常实用。
local json = require("dkjson")
local t = { name = "Ann", roles = { "dev", "lead" } }
print(json.encode(t, { indent = true }))编码数字和布尔值
Lua 数字和布尔值会直接编码为对应的 JSON 值。整数和浮点数都会变成 JSON 数字。
local json = require("dkjson")
local t = { count = 5, ratio = 1.5, active = true }
print(json.encode(t))nil 问题
您不能将 nil 存入表中来表示 JSON null,因为将值赋为 nil 会彻底移除该键。
要输出字面量 null,请将库提供的标记值 json.null 作为该值。
local json = require("dkjson")
local t = { middle = json.null }
print(json.encode(t)) -- {"middle":null}稀疏数组会出问题
如果序列中存在间隔(例如索引 2 为 nil),Lua 就不再将其视为规范数组。编码可能在间隔处停止,或产生异常行为。
请保持数组索引从 1 开始连续排列,以获得可预测的 JSON 数组。
local json = require("dkjson")
local t = { [1] = "a", [3] = "c" } -- gap at 2
print(json.encode(t)) -- unreliable将 JSON 写入文件
要持久化数据,请先将表编码为字符串,再将该字符串写入文件。
这样就可以保存设置、分数或任何结构化状态。
local json = require("dkjson")
local data = { theme = "dark", volume = 8 }
local f = io.open("settings.json", "w")
f:write(json.encode(data, { indent = true }))
f:close()空表默认编码为对象
空的 Lua 表 {} 没有任何键,因此 dkjson 默认会将其编码为空对象 {},而不是数组。
如果需要空数组,dkjson 允许您为该表添加标记;否则其类型无法确定。
local json = require("dkjson")
print(json.encode({})) -- {}不保证键的顺序
Lua 表中的字符串键没有固有顺序,因此编码后的 JSON 中各字段的顺序可能会变化。
不要依赖字段顺序;JSON 使用者应按名称查找键,而不是按位置查找。
往返一致性
先编码再解码后,应该会得到一个等价的表。这种往返处理是测试数据处理过程的好方法。
local json = require("dkjson")
local orig = { a = 1, list = { 2, 3 } }
local copy = json.decode(json.encode(orig))
print(copy.a, copy.list[2])使用 cjson 编码
lua-cjson 也提供 encode。它速度更快,但格式选项更少,并且会直接抛出错误,而不是返回错误。
如果需要带缩进的美化输出,dkjson 通常是更易用的选择。
local cjson = require("cjson")
local s = cjson.encode({ ok = true, n = 42 })
print(s)快速检查
测试您对 Lua 表编码的掌握程度。
回顾
编码会将 Lua 表转换为 JSON 字符串。以整数为键的序列会变成数组,以字符串为键的表会变成对象。
使用 json.null 表示字面量 null,保持数组连续,并传入 indent = true 以获得易读的输出。接下来您将处理深度嵌套的数据。
常见问题解答
「将表编码为 JSON」课时是免费的吗?
是的 — 「将表编码为 JSON」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Lua Academy 课程的其余内容,请升级到 CoddyKit PRO。 Lua Academy 课程共包含 4 节课。
「将表编码为 JSON」这节课中我会学到什么?
序列化 Lua 数据。 你通过在浏览器中直接运行的动手代码来练习 Lua Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Lua Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Lua Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「将表编码为 JSON」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Lua Academy 课中编写并运行代码吗?
能。每节 Lua Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 为什么使用 JSON
- 将 JSON 解码为表
- 将表编码为 JSON
- 处理嵌套数据