Json 模块

lua-users home
wiki

JSON(JavaScript? 对象表示法)是一种基于 JavaScript? 数据结构格式的数据序列化格式。有关 JSON 的一般信息,请参阅 https://json.js.cn/[JSON 的维基百科文章]

JSON 模块比较

由于一些模块仅称为“json”,因此添加了首字母以创建唯一名称

此比较最初由 dkjson 的作者 DavidKolf 发起,因此可能存在偏见。

为了进行比较,使用了默认选项。我(DavidKolf)期望模块在默认设置下符合 JSON 标准。Fleece 是一个例外,此比较中的大多数内容对于“E4”选项以外的选项都没有意义。

dkjson 仓库中可以找到 [功能/合规性测试][速度测试]

进一步的 JSON 实现

此比较(尚未)包含的 JSON 实现

主要错误

编码时的转义字符

根据 [RFC 4627],0 到 31 范围内的所有字符以及 \\ 和 \" 都必须转义。但是,建议也转义 Unicode 字符 U+2028 和 U+2029,以便 [生成有效的 JavaScript][原始 JSON 实现] 甚至更进一步,转义了 BMP 中的大多数控制字符和未定义的代码点。

解码时支持 Unicode 转义序列 \uXXXX

其他错误

编码的边缘情况

JSON 无法表示所有 Lua 结构。本节列出了一些情况下的行为。您不应将此类数据馈送到任何 JSON 模块,但了解模块如何处理这些数据仍然很有趣。模块不应挂起或崩溃,并且不应产生无效的 JSON 输出(引发 Lua 错误是处理此类数据的有效方式)。

混合表

{[1] = 1, a = 2}

稀疏数组

{[1000] = "test"}

NaN 和 Inf 的处理

nan = math.huge * 0
inf = math.huge

编码时防止引用循环

a = {}
a.a = a

空数组的处理

local json_str = '{"items":[],"properties":{}}'
assert(json_str == json.encode(json.decode(json_str)))

编码速度

解码速度

对于速度测试,一个表被编码或解码了 100000 次。这些值不精确,使用其他数据时可能不同,但它们应该能提供一般性的参考。待办事项 - 在不知道表是什么的情况下,很难在这里运行新的测试?

另请参阅


RecentChanges · preferences
编辑 · 历史
最后编辑于 2018 年 8 月 5 日上午 12:27 GMT (差异)