【问题标题】:I can't write/encode JSON files properly. Code produces different results我无法正确编写/编码 JSON 文件。代码产生不同的结果
【发布时间】:2014-10-04 08:34:24
【问题描述】:

我的 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)

Collection 是一个预加载的 Lua 表,其结构如下:{"common" = {​​"001", "002", "003",..., "020"}}。为了这个问题,我将卡片限制在某个类别(普通)。假设玩家赢得了 3 号牌,那么代码应该是这样运行的:

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

结果表数组将是:

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

当我使用函数 writeFile("playerCards.json", array) 时,我将上面的表格编码到文件 playerCards.json 中。目前,这段代码完美运行,生成的 JSON 文件如下:

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

当玩家拿到一张9以上的卡,比如15时,问题就来了。写入的时候,JSON文件变成了这样:

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

相同的代码怎么会产生如此不同的结果?你能帮我解决这个问题吗?如果需要,这里是加载和写入函数的代码:

local loadFile = function(name)
    local data = nil
    local path = system.pathForFile(name, system.DocumentsDirectory)
    handle = io.open(path, "r")

    if handle then
        data = json.decode(handle:read("*a"))
        io.close(handle)
    end
    return data
end

local writeFile = function(name, data)
    local path = system.pathForFile(name, system.DocumentsDirectory)
    local handle = io.open(path, "w+")
    if handle then
        handle:write(json.encode(data))
        io.close(handle)
    end
end

【问题讨论】:

    标签: json lua coronasdk


    【解决方案1】:

    问题在于 Lua 不区分列表和映射对象(表用于两者),而 JSON 可以。

    这在序列化为 JSON 时会产生歧义;序列化程序必须确定 Lua 表是否应该序列化为数组或对象。大多数序列化程序通过检查表的键是否大致是顺序整数来做到这一点,如果是,则仅序列化为数组。如果您的数组太“稀疏”,如第二个示例所示,那么序列化程序会认为它是一个带有数字键的映射。

    我不了解 Corona,但我见过的一些 Lua JSON 库包含一种将表显式标记为数组的方法。或者,您可以使用 false 之类的占位符值来填充数组的空槽,而不是 nil

    【讨论】:

    • 谢谢。当我使用false 保持“空白”位置时,它工作得很好。我寻找那些库,但找不到任何可以解决这个问题的库。无论如何,您的解决方案做得很好,现在 JSON 文件的结构应该是这样的。
    猜你喜欢
    • 2018-09-13
    • 1970-01-01
    • 1970-01-01
    • 2019-12-05
    • 2014-07-28
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多