JSON.parse将嵌套数组中的数值转为null的异常问题求助
首先,你提供的JSON字符串是完全合法的,直接使用JSON.parse解析会得到正确结果——[33,0]和[1,0]数组会被正常保留,不会转为null。你遇到的异常大概率不是JSON.parse本身的问题,而是以下几种情况之一:
1. 解析后的对象被后续代码篡改
最可能的原因是:在JSON.parse完成后,你的代码中其他逻辑(比如数据处理、状态同步或第三方库)立即修改了adminData,把这些数值数组替换成了null。
浏览器控制台的惰性求值特性会加剧这个误解:当你console.log(adminData)时,控制台并不会立即快照对象的所有属性,而是在你点击展开日志时才读取对象的当前状态。如果此时对象已经被修改,你看到的就是篡改后的null值,而非JSON.parse返回的原始结果。
验证方法:
在解析后立即序列化对象,生成不可变的快照日志:
var adminData = JSON.parse(brackets[id].data); // 快照解析后的原始状态 console.log("解析后原始状态:", JSON.stringify(adminData)); console.log("ADMIN DATA"); console.log(adminData);
如果快照显示[33,0]和[1,0]存在,说明JSON.parse是正确的,问题出在后续代码的篡改上。
2. 待解析的JSON字符串已被篡改
你提供的JSON字符串是正确的,但实际运行时brackets[id].data可能已经被其他代码修改(比如某些逻辑替换了字符串中的[33,0]为null),导致解析结果异常。
验证方法:
在解析前直接输出原始字符串的内容和类型,确认它是未被修改的合法JSON:
console.log("原始数据类型:", typeof brackets[id].data); console.log("原始数据内容:", brackets[id].data); // 验证字符串是否合法JSON try { JSON.parse(brackets[id].data); console.log("原始数据是合法JSON"); } catch(e) { console.error("原始数据JSON格式错误:", e); }
如果输出的字符串中[33,0]已经变成null,说明在解析前数据就被篡改了。
3. 控制台显示的误导
如前所述,浏览器控制台对对象的日志是惰性的。如果你在console.log(adminData)后修改了对象,展开日志时看到的是修改后的状态,而非解析时的状态。
验证方法:
直接打印具体属性,避免依赖对象展开:
var adminData = JSON.parse(brackets[id].data); console.log("结果数组第一个元素:", adminData.results[0][0][0][0]);
如果这个输出是[33,0],说明解析正确,只是控制台展示的问题。
排查建议
- 在
JSON.parse后立即设置断点,用调试器查看adminData的原始状态,确认数组是否存在。 - 检查代码中所有修改
adminData或brackets[id].data的逻辑,找出可能的篡改点。 - 避免直接依赖控制台的对象展开结果,改用序列化快照或直接打印具体属性来验证数据状态。
内容的提问来源于stack exchange,提问作者Splen

