Lua表转JSON报错:期望字符串索引却得到数字的问题咨询
Lua表转JSON报错解决方案
问题说明
我有如下Lua表:
local my_table = {data = {{value1 = "test1", value2 = "test2"}, {value3 = "test3", value4 = "test4"}}}
尝试调用json.encode(my_table)将其转为JSON并保存时,报错:bad argument #1 to 'encode' (["data"] => string index expected, got number),期望生成的JSON格式为:
{ "data":[ { "value1":"test1", "value2":"test2" }, { "value3":"test3", "value4":"test4" } ] }
错误原因
报错是因为你使用的JSON编码库默认将Lua中数字索引的表(数组结构)识别为字符串键的对象,而非标准JSON数组,导致编码逻辑冲突。
解决办法
根据你使用的JSON库类型,选择对应方案:
方案1:使用dkjson库
dkjson需要显式开启自动数组检测,或指定数组标识:
local dkjson = require("dkjson") -- 启用自动数组检测并生成带缩进的格式化JSON local json_content = dkjson.encode(my_table, {indent = true, arrays = true}) -- 写入文件 local output_file = io.open("result.json", "w") output_file:write(json_content) output_file:close()
arrays = true参数会让库自动识别从1开始的连续数字索引表为JSON数组。
方案2:使用cjson库(LuaJIT环境常用)
cjson默认支持连续数字索引表转为JSON数组,直接编码即可:
local cjson = require("cjson") -- 生成压缩格式JSON local json_content = cjson.encode(my_table) -- 如需带缩进的格式化输出,部分版本支持encode_pretty -- local json_content = cjson.encode_pretty(my_table) -- 写入文件 local output_file = io.open("result.json", "w") output_file:write(json_content) output_file:close()
方案3:更新JSON库
若使用的是老旧版本的JSON库,可能存在数组识别逻辑缺陷,建议替换为最新版的dkjson或cjson。
内容的提问来源于stack exchange,提问作者Mateus Mattos
相关产品推荐
相关产品推荐

