Lua读取json文件

92dk7w1h  于 2023-05-02  发布在  其他
关注(0)|答案(1)|浏览(184)

我试图在lua中读取json文件,下面的代码(测试。但是当我运行这段代码时,我没有得到任何输出,脚本只是挂起。我不明白我错在哪里

json = require("json") 
f = io.open(path, "r")
io.input(f)
local content = io.read("*a")
io.close()
config = json.decode(content)
for key, value in pairs(config) do print(key, value) end

注意:-我已经放置了JSON。lua在我创建这个测试的同一个文件夹中。卢阿

rjee0c15

rjee0c151#

让我们重写你的代码:

local json = require("json")
local f = assert(io.open(path, "r")) -- assuming path is in the scope
local content = f:read("*a")
f:close()
local config = json.decode(content)
for key, value in pairs(config) do print(key, value) end

从5.4开始,您可以保存:close()并将其替换为更健壮的<close>(如果变量在错误的情况下超出范围,也会被触发):

local f <close> = assert(io.open(path, "r"))

这消除了可能导致挂起的错误(未指定的行为):如果打开文件失败(e.例如,文件未找到或缺少权限),则io.input(nil)将是一个no-op,返回当前的标准输入,但不更改它。因此,当尝试使用io.read("*a")读取所有文件时,您将在stdin上等待文件结束。
它还消除了ESkri在评论中指出的第二个错误:调用io.close()关闭你的stdout。它不会关闭您的标准输入。文件保持打开状态。
要正确地报错,请将对io.open的调用 Package 在Assert中。
除非有必要,否则篡改全局标准输入或标准输出是非常不好的做法。(Ab)使用stdin和stdout进行文件I/O而不是直接使用文件句柄是一种巨大的代码气味,甚至不更简洁。

相关问题