简体   繁体   中英

Corona SDK JSON usage

I have an operating JSON library which I use to load an array of tile IDs. When I double click main.lua directly from file explorer, it runs great, but when I open Corona Simulator and open my project from there or build my project and run it on my testing device, it gives me a null reference error when I attempt to use the data I loaded.

Here is the function to load a table from a JSON file:

function fileIO.loadJSONFile (fileName)
    local path = fileName
    local contents = ""
    local loadingTable = {}
    local file = io.open (path, "r")
    print (file)
    if file then
        local contents = file:read ("*a")
        loadingTable = json.decode (contents)
        io.close (file)

        return loadingTable
    end

    return nil
end

Here is the usage:

function wr:renderChunkFile (path)
    local data = fileIO.loadJSONFile (path)

    self:renderChunk (data)
end

function wr:renderChunk (data)
    local a, b = 1

    if (self.img ~= nil) then
        a = #self.img + 1
        self.img[a] = {}
    else
        self.img[1] = {}
    end

    if (self.chunks ~= nil) then
        b = #self.chunks + 1
        self.chunks[b] = display.newGroup ()
    else
        self.chunks[1] = display.newGroup ()
    end

    for i = 1, #data do  -- Y axis                       ERROR IS HERE
        self.img[a][i] = {}
        for j = 1, #data[i] do  -- Z axis
            self.img[a][i][j] = {}
            for k = 1, #data[i][j] do  -- X axis
                if (data[i + 1] ~= nil) then
                    if (data[i + 1][j][k] < self.transparentLimit) then
                        self.img[a][i][j][k] = display.newImage ("images/tiles/"..data[i][j][k]..".png", k*self.tileWidth, display.contentHeight -j*self.tileDepth - i*self.tileThickness)
                        self.chunks[b]:insert (self.img[a][i][j][k])

                    elseif(data[i + 1] == nil) then
                        self.img[a][i][j][k] = display.newImage ("images/tiles/"..data[i][j][k]..".png", k*self.tileWidth, display.contentHeight -j*self.tileDepth - i*self.tileThickness)
                        self.chunks[b]:insert (self.img[a][i][j][k])
                    end
                end
            end
        end
    end
end

When it gets to the line for i = 1, #data do it tells me it is trying to access the length of a nil field. Where did I go wrong here?

EDIT: I feel the need to give a more clear explanation of what my problem is. I am getting inconsistent results from this program. When I select main.lua in file explorer and open it with Corona Simulator, it works. When I open Corona Simulator and internally navigate to main.lua, it does not work. When I build the project and test it on my device, it does not work. What I really need is some insight into Corona's JSON library and APK internal directory structure requirements (directory nesting limits, naming restrictions, etc.). If someone thinks of something else that might cause the issue I am having, please bring it up! I am open to anything.

Without seeing the entire error message and not knowing what the value of "path" is it's going to be hard to speculate. But Corona SDK uses four base directories:

system.ResourceDirectory -- Same folder as main.lua and is read-only system.DocumentsDirectory -- Your writable folder where your data lives system.CachesDirectory -- for downloaded files system.TemporaryDirectory -- for temp files.

The last three, while in the simulator are in the project's Sandbox master folder. On device who knows where the folders really are.

In your case, if your JSON file is going to be included in with your downloadble app, your .json file should be in the same folder with your main.lua (or a sub folder) and referenced in system.ResourceDirectory.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM