无法正确地编写/解码JSON文件。代码生成不同的结果。

我在我 Corona 游戏中的 JSON 文件中遇到了问题。基本上,当你达到一定的分数时,游戏会给你奖杯(卡片)。然后,卡片信息会被写入 JSON 文件中。当你开始游戏时,它会检查文件“playerCards.json”是否存在,如果不存在,则创建此文件并具有以下结构:

{"common":[],"uncommon":[],"rare":[]}

稍后在游戏中,玩家最终会收到一张卡片。简化的代码如下:

local category = "common"
local rdm = math.random(1,20)

array = loadFile("playerCards.json")

array[category][rdm] = collection[category][rdm]

writeFile("playerCards.json", array)

集合是一个预加载的 Lua 表结构,如下所示:{"common" = {"001", "002", "003",…,"020"}}。为了问题的简便,我将卡片限制为某个类别(常规)。假设玩家赢得了第3张卡片,所以代码应该这样运行:

array ["common"] [3]=collection ["common"] [3]

结果表数组将是:

array = {"common" = {null, null, "003"}}

当我使用函数 writeFile(“playerCards.json”,array)将上面的表格编码为文件 playerCards.json 时。目前,这段代码运行得很好,生成的 JSON 文件如下所示:

{"common":[null,null,"003"],"uncommon":[],"rare":[]}

问题出现在玩家获得9以上的卡片时,例如15。写入时,JSON 文件变成了这样:

{"common":{"3":"003","15":"015"},"uncommon":[],"rare":[]}

同样的代码如何产生如此不同的结果?你能帮我解决这个问题吗?如果需要,这里是 load 和 write 函数的代码:

点赞
用户646619
用户646619

问题在于 Lua 不区分列表和映射对象(两者都使用表格),而 JSON 区分它们。

这会在序列化为 JSON 时产生歧义;序列化程序必须确定 Lua 表格应该序列化为数组还是对象。大多数序列化程序通过检查表格的键是否大致连续来执行此操作。如果是这样,只有将其序列化为数组。如果您的数组太“稀疏”,例如您的第二个示例,那么序列化程序会认为它是带有数值键的映射。

我不知道 Corona,但我见过一些 Lua JSON 库包括将表格明确标记为数组的方法。或者,您可以使用 false 而不是 nil 来填充数组的空槽作为占位符值。

2014-08-11 16:50:32