【发布时间】:2014-01-07 17:27:34
【问题描述】:
我想将复杂数据从 C++ 服务传送到 Lua 应用程序。这种通信通过网络进行。为了 Lua 应用程序的简单性和速度,我更喜欢发送文字 Lua 表文字(不需要单独的解析器)而不是 XML、JSON 或 YAML 等。
虽然存在编写 JSON 的 C++ 库之类的东西,但我找不到用于创建序列化 Lua 的现有 C++ 库。那么,我的想法是使用现有的 C++ JSON 库,然后将字符串转换为 Lua。
所以,例如,我想转换这个字符串:
{
"hello":42,
"array":[1,2,{"more":false},null,true],
"worst":"still [null]: got it?"
}
进入这个字符串:
{
["hello"]=42,
["array"]={1,2,{["more"]=false},nil,true},
["worst"]="still [null]: got it?"
}
一个天真的replace_all 转换为: 到=,[] 到{},和null 到nil 将破坏字符串内的内容。如何执行此转换?
为了避免XY problem 的问题,我在顶部和标题中包含了我的最终动机,以防 JSON->Lua 字符串转换是错误的选择。
【问题讨论】:
-
嗯,不转换字符串内的内容?这不是很简单,但如果你能做到那个,那么它应该正是你所描述的,不是吗?实际上从 Lua 恕我直言解析 JSON 也不是特别难。带有 LPEG 的 LuaJSON 的快速版本不一定比解析实际的 Lua 代码慢,所以如果你可以让它在脚本中运行,我认为这是一个更简单的选择。我个人对此没有任何问题(在我的情况下,我使用的不仅仅是 C++ 数据源,因此 JSON 是一个合乎逻辑的选择)。
-
然而,我忘记的一点是,在使用 Lua 表时,您实际上可以使用自动转换为字节码,这应该会明显加快速度。这可以通过使用 BSON 或其他压缩 JSON 格式绕过 OTOH。
-
@BartekBanachewicz 也许我过早地优化了,但我很难相信 LPEG LuaJSON 的速度接近
local t = loadstring('return '..json)() -
为什么? LPEG 是一个 C 库,实际上是由编写 Lua 本身的同一个人编写的(因此受益于本机代码优化和执行)。即使存在一些速度差异,我也非常怀疑它会相差那么。实际上,对两者进行基准测试并没有什么坏处,对吧? :)
-
@BartekBanachewicz 挑战已接受。 :) LuaJSON 是 ~5x slower than 本地 Lua 加载。