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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 11:35:28