gpt4 book ai didi

lua - 我怎么知道一个表是否是一个数组?

转载 作者:行者123 更新时间:2023-12-04 00:28:25 25 4
gpt4 key购买 nike

我正在开发一个简单的优化 JSON功能。 Lua 使用表来表示数组,但在 JSON 中我需要在它们之间进行识别。使用下面的代码:

t={
a="hi",
b=100
}

function table2json(t,formatted)
if type(t)~="table" then return nil,"Parameter is not a table. It is: "..type(t) end

local ret=""--return value
local lvl=0 --indentation level
local INDENT=" " --OPTION: the characters put in front of every line for indentation
function addToRet(str) if formatted then ret=ret..string.rep(INDENT,lvl)..str.."\n" else ret=ret..str end end

addToRet("{")
lvl=1
for k,v in pairs(t) do
local typeof=type(v)
if typeof=="string" then
addToRet(k..":\""..v.."\"")
elseif typeof=="number" then
addToRet(k..":"..v)
end
end
lvl=0
addToRet("}")

return ret
end

print(table2json(t,true))

正如您在 JSON 引用中看到的 object就是所谓的 table在 Lua 中,它不同于 array .

问题是如何检测表是否被用作数组?
  • 当然,一种解决方案是遍历所有对,看看它们是否只有数字连续键,但这还不够快。
  • 另一种解决方案是在表中放置一个标志,表明它是一个数组而不是一个对象。

  • 任何更简单/更智能的解决方案?

    最佳答案

    如果您想要快速、简单、非侵入式的解决方案,最多有时,我会说只检查索引 1 - 如果它存在,则该表是一个数组。当然,不能保证,但根据我的经验,表格很少同时具有数字键和其他键。您是否可以接受将某些对象误认为数组以及您是否希望这种情况经常发生取决于您的使用场景 - 我想这对一般 JSON 库不利。

    编辑:为了科学,我去看看 Lua CJSON 是怎么做的。它遍历所有对并检查所有键是否都是整数,同时保持最大键(相关函数是 lua_array_length )。然后它决定是否将表序列化为数组或对象,具体取决于表的稀疏程度(比率由用户控制),即索引为 1、2、5、10 的表可能会被序列化为数组,而索引为 1、2、5、10 的表可能会被序列化为数组索引 1,2,1000000 将作为一个对象。我想这实际上是一个很好的解决方案。

    关于lua - 我怎么知道一个表是否是一个数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7526223/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com