在Solar 2D中如何将字符串转为table?排查并修复错误代码
Solar2D中字符串与Table互转问题修复
原代码的核心问题
loadstring未执行返回函数:loadstring生成的是可执行函数,必须调用它(加())才能得到解析后的Table,直接访问函数的索引会报错。- 字符串转义写法冗余:原代码用
"\\".."\""生成转义引号,完全可以简化为"\"",不影响功能但写法没必要复杂。 - 数字类型处理缺失:原代码会把数字也转成带引号的字符串,若需要保留数字类型会不符合预期。
修复后的完整代码
actionTable = {projectsSettings = {projects = {"Default"}},settings = {projectName = "Default"},blocks = {Default = {ifTouch = {quantityBlocks = "0"},ifStart = {quantityBlocks = "0"}}}} local function tableToString(tbl) local result = "{" for k, v in pairs(tbl) do -- 处理字符串类型的键 if type(k) == "string" then result = result .. k .. " = " end -- 根据值的类型拼接字符串 if type(v) == "table" then result = result .. tableToString(v) elseif type(v) == "boolean" then result = result .. tostring(v) elseif type(v) == "number" then -- 数字直接拼接,不添加引号 result = result .. tostring(v) else -- 字符串转义双引号 result = result .. "\"" .. v .. "\"" end result = result .. "," end -- 移除最后一个多余的逗号 if #result > 1 then result = result:sub(1, #result - 1) end return result .. "}" end local str1 = tableToString(actionTable) print(str1 .. " STR") -- 执行loadstring返回的函数,获取解析后的Table local tbl1 = loadstring("return " .. str1)() if tbl1 then print(tbl1.settings.projectName) -- 输出 Default else print("Table解析失败") end
更简便的方案:用Solar2D自带JSON库
手动写序列化函数容易踩各种类型处理的坑,Solar2D自带json库可以直接实现Table和字符串的互转,更稳定:
local json = require("json") -- Table转字符串 local str1 = json.encode(actionTable) -- 字符串转Table local tbl1 = json.decode(str1) print(tbl1.settings.projectName) -- 输出 Default
内容的提问来源于stack exchange,提问作者C2G
相关产品推荐
相关产品推荐

