0Pricing
Lua Academy · 课时

将表编码为 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 反馈 — 无需本地设置。

此课程中的所有课时

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