如何将指定JSON文件转换为Lua表?dkjson解析文件时类型错误的排查与解决
问题排查与解决办法
错误原因分析
你遇到的 bad argument #1 to 'strfind' (string expected, got FILE*) 错误逻辑很清晰:dkjson.decode() 只接受字符串类型的参数,但你直接把打开的文件对象(FILE*)传了进去,dkjson没办法直接解析文件句柄,自然会抛出类型不匹配的错误。
另外补充一句:dkjson本身完全支持解析带换行符的合法JSON,你之前遇到的换行解析问题,大概率也是因为没正确读取文件内容导致的,不是库本身的限制。
修正后的代码实现
你需要先读取文件中的全部内容(包括换行符)转换成字符串,再传给json.decode()。这里提供两种可靠的写法:
写法1:手动管理文件打开与关闭(更易排查问题)
local json = require("dkjson") -- 打开目标JSON文件 local file = io.open("C:\\Users\\...\\Documents\\Lua_Plugins\\test_file_reader\\test.json", "r") -- 先判断文件是否成功打开 if not file then print("无法打开目标文件,请检查路径是否正确!") return end -- 读取文件全部内容(*a 表示读取所有内容,包含换行符、空格等所有字符) local json_content = file:read("*a") -- 及时关闭文件,避免资源占用 io.close(file) -- 解析JSON字符串为Lua表,同时捕获可能的解析错误 local myTable, parse_err = json.decode(json_content) -- 处理解析结果 if parse_err then print("JSON解析失败:", parse_err) else -- 直接print表只会输出内存地址,用dkjson反向编码成格式化JSON更易查看内容 print(json.encode(myTable, {indent = true})) end
写法2:更简洁的读取方式
local json = require("dkjson") -- 用table.concat + io.lines读取全部内容,自动拼接换行符 local json_content = table.concat(io.lines("C:\\Users\\...\\Documents\\Lua_Plugins\\test_file_reader\\test.json"), "\n") -- 解析并处理结果 local myTable, parse_err = json.decode(json_content) if parse_err then print("解析出错:", parse_err) else print(json.encode(myTable, {indent = true})) end
额外说明
- 关于换行符:合法的JSON允许包含换行、空格等空白字符,dkjson会自动忽略这些空白进行解析,只要你的JSON文件格式符合规范,带换行完全不会影响解析。
- 你提到的piglet方案处理文件失败,大概率也是犯了同样的错误——传了文件对象而非字符串内容,修正读取逻辑后应该就能正常工作。
- 查看Lua表内容:直接
print(myTable)只会输出表的内存地址(比如table: 0xXXXXXX),用json.encode(myTable, {indent = true})把表重新转换成格式化的JSON字符串,能更直观地看到解析结果。
内容的提问来源于stack exchange,提问作者Glupschi
相关产品推荐
相关产品推荐

