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

JavaScript无法将Lua传来的序列化字符串转为可用嵌套数组如何解决

解决方案

第一步:确认Lua侧序列化格式正确性

  • 首先排查Lua侧json.encode输出的字符串格式,符合要求的序列化结果应该和下方结构完全一致:
    [[7,1,"This is a test",1,"05:30:35pm","09/23/2021",1],[7,1,"Test Test",1,"05:40:35pm","09/26/2021",2]]
    
  • 多数Lua JSON库会将非连续数字索引、含非数字键的表序列化为对象而非数组,所以要保证存储查询结果的Lua表是纯连续数字索引的数组,参考写法:
    local resultArr = {}
    for _, row in ipairs(nTele) do
      -- 按你当前需要的下标顺序组装行数组,不要保留字段键
      local rowArr = {
        row.id,
        row.type,
        row.content,
        row.status,
        row.send_time,
        row.send_date,
        row.sort_id
      }
      table.insert(resultArr, rowArr)
    end
    local newTele = json.encode(resultArr)
    -- 发送newTele到JS侧
    

第二步:JS侧正确解析逻辑

不要手动做split、正则匹配等多余处理,直接使用原生JSON.parse解析即可,和你硬编码的数组用法完全兼容:

// 假设NUI传递过来的原始字符串存在receivedStr变量中
var Atest = JSON.parse(receivedStr)

// 直接按原有逻辑遍历取值即可
Atest.forEach(v => {
  console.log(v[0], v[5]) // 可正常读取对应下标的值
})

如果解析失败,大概率是NUI传输时自动加了转义字符,用下方兼容逻辑处理即可:

function parseTeleData(str) {
  // 去除首尾多余的包裹引号
  if (str.startsWith('"') && str.endsWith('"')) {
    str = str.slice(1, -1)
  }
  // 还原转义的双引号
  str = str.replace(/\\"/g, '"')
  return JSON.parse(str)
}
var Atest = parseTeleData(receivedStr)

后续字段名取值改造方案

不需要先转索引数组再改键值,直接修改Lua侧序列化逻辑即可一步到位:

  • Lua侧直接把查询行存入结果数组:
    local resultArr = {}
    for _, row in ipairs(nTele) do
      table.insert(resultArr, row)
    end
    local newTele = json.encode(resultArr)
    
  • JS侧解析后直接用数据库字段名取值:
    var Atest = JSON.parse(receivedStr)
    Atest.forEach(v => {
      console.log(v.id, v.send_date) // 直接用字段名取值,不受字段顺序变化影响
    })
    

内容的提问来源于stack exchange,提问作者Tim Flinn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 12:39:03