LUA从文件加载JSON配置

时间:2016-06-23 15:47:37

标签: json nginx lua openresty cjson

我正在尝试将旧的LUA方法移动到“class”中,该方法将一些JSON内容从文件加载到全局变量中。但我总是得到以下错误:

attempt to call field 'decode' (a nil value)
attempt to index global 'cjson' (a nil value)

我不太了解lua但是我几乎没有尝试所有组合,所以你能解释为什么会出现这种错误吗?

模块的当前实现如下:

Config = {}
Config.__index = Config

function Config.create(config_filename)
   local cjson = require("cjson") 
   local config = {}               
   setmetatable(config,Config)  

   local f = io.open(config_filename, "r")
   local content = f:read("*a")
   f:close()
   config = cjson.decode(content)

   return config
end

return Config

作为最终结果,我想从其他文件中执行类似的操作:

local config_class = require("config")
local config = config_class.create("/path/to/file.json")

ngx.say(config:some_configuration_data())

1 个答案:

答案 0 :(得分:1)

由于错误消息告诉你cjson和decode是无法索引或调用的nil值。

nil将加载一些文件并运行包含的代码并传递返回值。如果您运行Lua脚本,它的行为就像一个默认返回require的函数。因此,除非您指定脚本返回的内容nil将返回nil

我不知道你需要的cjson文件里面有什么,但它显然不会返回想要的json实现,而是end

因此cjson中的代码应该返回一个Lua表,其中的函数存储在键“decode”下。