为什么JSON.parse执行时返回undefined,解析失败原因是什么?
JSON.parse解析失败原因分析
核心原因
待解析的JSON字符串格式非法,外层多了一对多余的双引号包裹。你提供的待解析内容为:
"{"eventId":"program-1","eventTimesSelected":{"243759548768171":"2021-11-30T23:00:00Z"}}"
首尾的双引号不属于合法JSON的组成部分,JSON.parse解析时会将首个双引号识别为字符串类型的起始标识,后续的{不符合JSON字符串语法规则,直接触发语法错误,导致解析失败返回undefined。
其他排除项
如果是localStorage中不存在startPaymentIn对应的键值,getItem会返回null,JSON.parse(null)的执行结果是null,不会返回undefined,因此该情况可以排除。
问题根因溯源
出现该问题通常是存储逻辑错误:往localStorage存储数据时,对JSON.stringify()的返回结果做了额外的转义、手动添加了引号、或者重复调用了JSON.stringify(),导致存入的内容多了一层包裹。
解决方案
- 优先修正存储逻辑:往localStorage存值时直接传入
JSON.stringify(目标数据对象)的返回值即可,不要做额外的字符串处理,正确存储示例:
const targetData = { eventId:"program-1", eventTimesSelected:{"243759548768171":"2021-11-30T23:00:00Z"} }; // 直接存储JSON.stringify的返回结果即可 localStorage.setItem("startPaymentIn", JSON.stringify(targetData));
- 若暂时无法修改上游存储逻辑,可以先对取出的字符串做清洗,移除首尾多余的双引号后再解析:
const startPaymentIn2 = localStorage.getItem("startPaymentIn"); // 正则移除首尾的双引号 const cleanedJsonStr = startPaymentIn2.replace(/^"|"$/g, ''); let startPaymentIn3 = JSON.parse(cleanedJsonStr);
内容的提问来源于stack exchange,提问作者János
相关产品推荐
相关产品推荐

