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
相关产品推荐
相关产品推荐

