Lua表序列化的方法

9

我可能疏忽了,但是是否有一种内置的方法可以将lua表序列化/反序列化为文本文件,反之亦然?

我已经准备好了一对方法,用于处理具有固定格式的lua表(例如,具有5行3列数据)。

是否有一种方法可以处理任何任意格式的lua表?

例如,给定以下lua表:

local scenes={
    {name="scnSplash",
        obj={
            {
                name="bg",
                type="background",
                path="scnSplash_bg.png",
            },
            {
                name="bird",
                type="image",
                path="scnSplash_bird.png",
                x=0, 
                y=682,
            },
        }
    },
}

它将被转换为以下文本:

{name="scnSplash",obj={{name="bg",type="background",path="scnSplash_bg.png",},{name="bird",  type="image",path="scnSplash_bird.png",x=0,y=682,}},}

序列化文本的格式可以自由定义,只要文本字符串可以反序列化成一个空的Lua表即可。

这个问题提供了一些关于序列化格式的有用信息:https://dev59.com/t2w15IYBdhLWcg3w3ffN - Pierz
这似乎是Jsonman的工作! - mhvelplund
5个回答

11

我不确定为什么JSON库被标记为正确答案,因为它在序列化"具有任意格式的Lua表"方面似乎非常有限。它不能处理布尔值/表/函数作为键以及无限循环引用。共享引用在序列化时没有被标记为共享,而math.huge值在Windows上无法正确序列化。我意识到大部分是JSON的局限性(因此在库中实现了这种方式),但是它被提出作为通用Lua表序列化的解决方案(它不是)。

更好的选择是使用TableSerialization页面中的实现之一,或者使用我的Serpent序列化器和漂亮打印机


我同意你的观点,Lua并不是JS。 - Hola Soy Edu Feliz Navidad

5

哎呀,难怪Lua表看起来像JSON,因为在这里已经有一个Corona库了(http://blog.anscamobile.com/2011/08/tutorial-exploring-json-usage-in-corona/)。 - cctan

2
require "json"
local t = json.decode( jsonFile( "sample.json" ) )

请参考这里以获取一个简单的JSON序列化器。


1
rxi/json.lua中的json.lua添加到您的项目中,然后使用以下代码:
local json = require("json")

local encoded = json.encode({
  name = "J. Doe",
  age = 42
})

local decoded = json.decode(encoded)

print(decoded.name)

请注意,如果您尝试序列化的值中有函数,则该代码会出现错误。您需要修复代码中第82和93行以跳过具有函数类型的值。

0
小解决方案:密钥可以不用括号,但请确保没有负号或其他特殊符号。
local nl = string.char(10) -- newline
function serialize_list (tabl, indent)
    indent = indent and (indent.."  ") or ""
    local str = ''
    str = str .. indent.."{"..nl
    for key, value in pairs (tabl) do
        local pr = (type(key)=="string") and ('["'..key..'"]=') or ""
        if type (value) == "table" then
            str = str..pr..serialize_list (value, indent)
        elseif type (value) == "string" then
            str = str..indent..pr..'"'..tostring(value)..'",'..nl
        else
            str = str..indent..pr..tostring(value)..','..nl
        end
    end
    str = str .. indent.."},"..nl
    return str
end

local str = serialize_list(tables)
print(str)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接