You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将指定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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 19:29:04