Corona SDK JSON 用法
Corona SDK JSON usage
我有一个正在运行的 JSON 库,我用它来加载一组图块 ID。当我直接从文件资源管理器双击 main.lua 时,它 运行 很好,但是当我打开 Corona Simulator 并从那里打开我的项目或构建我的项目并 运行 它在我的测试设备上时,当我尝试使用我加载的数据时,它给了我一个空引用错误。
这是从 JSON 文件加载 table 的函数:
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
用法如下:
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
当它到达行 for i = 1, #data do
时,它告诉我它正在尝试访问 nil
字段的长度。我哪里错了?
编辑: 我觉得有必要更清楚地解释我的问题所在。我从这个程序中得到不一致的结果。当我在文件资源管理器中 select main.lua 并使用 Corona Simulator 打开它时,它可以工作。当我打开 Corona Simulator 并在内部导航到 main.lua 时,它不起作用。当我构建项目并在我的设备上测试它时,它不起作用。我真正需要的是深入了解 Corona 的 JSON 库和 APK 内部目录结构要求(目录嵌套限制、命名限制等)。如果有人想到其他可能导致我遇到的问题,请提出来!我对任何事情都持开放态度。
如果没有看到整个错误消息并且不知道 "path" 的值是什么,则很难推测。但是 Corona SDK 使用四个基本目录:
system.ResourceDirectory -- 与 main.lua 相同的文件夹并且是只读的
system.DocumentsDirectory -- 您的数据所在的可写文件夹
system.CachesDirectory -- 对于下载的文件
system.TemporaryDirectory -- 用于临时文件。
最后三个在模拟器中位于项目的 Sandbox master 文件夹中。在知道文件夹实际位置的设备上。
在您的情况下,如果您的 JSON 文件将包含在您的可下载应用程序中,您的 .json 文件应该与您的 main.lua (或子文件夹)并在 system.ResourceDirectory 中引用。
我有一个正在运行的 JSON 库,我用它来加载一组图块 ID。当我直接从文件资源管理器双击 main.lua 时,它 运行 很好,但是当我打开 Corona Simulator 并从那里打开我的项目或构建我的项目并 运行 它在我的测试设备上时,当我尝试使用我加载的数据时,它给了我一个空引用错误。
这是从 JSON 文件加载 table 的函数:
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
用法如下:
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
当它到达行 for i = 1, #data do
时,它告诉我它正在尝试访问 nil
字段的长度。我哪里错了?
编辑: 我觉得有必要更清楚地解释我的问题所在。我从这个程序中得到不一致的结果。当我在文件资源管理器中 select main.lua 并使用 Corona Simulator 打开它时,它可以工作。当我打开 Corona Simulator 并在内部导航到 main.lua 时,它不起作用。当我构建项目并在我的设备上测试它时,它不起作用。我真正需要的是深入了解 Corona 的 JSON 库和 APK 内部目录结构要求(目录嵌套限制、命名限制等)。如果有人想到其他可能导致我遇到的问题,请提出来!我对任何事情都持开放态度。
如果没有看到整个错误消息并且不知道 "path" 的值是什么,则很难推测。但是 Corona SDK 使用四个基本目录:
system.ResourceDirectory -- 与 main.lua 相同的文件夹并且是只读的 system.DocumentsDirectory -- 您的数据所在的可写文件夹 system.CachesDirectory -- 对于下载的文件 system.TemporaryDirectory -- 用于临时文件。
最后三个在模拟器中位于项目的 Sandbox master 文件夹中。在知道文件夹实际位置的设备上。
在您的情况下,如果您的 JSON 文件将包含在您的可下载应用程序中,您的 .json 文件应该与您的 main.lua (或子文件夹)并在 system.ResourceDirectory 中引用。