向localStorage存入JSON时转义符丢失,解析报错如何解决?
我太懂这个坑了——手动加了转义符存进localStorage,结果转义符凭空消失,JSON.parse直接报错。其实问题出在你手动构造JSON字符串的方式上,JavaScript的字符串字面量会先解析掉转义符,等存到localStorage时,\早就没了。
正确姿势:用JSON.stringify()自动处理转义,别手动折腾
你完全不用自己写带转义的字符串,正确流程应该是:先定义要存储的JavaScript对象,再用JSON.stringify()把它转换成标准的JSON字符串,最后存入localStorage。转义的事儿交给内置函数处理,省心又不出错。
举个实际可用的例子:
// 先定义你要存储的原始数据对象 const userData = ["~#iM", ["loading", false, "auth"]]; // 用JSON.stringify自动转成合法的JSON字符串 const jsonString = JSON.stringify(userData); // 存入localStorage localStorage.setItem("users", jsonString);
这样存进去的内容是["~#iM",["loading",false,"auth"]](没有多余的外层引号,内部格式完全符合JSON规范),之后你用JSON.parse(localStorage.getItem("users"))就能直接解析出原对象,不会再报转义相关的错误。
为啥你原来的代码不行?
看你写的存入代码:
localStorage.setItem( "users", `"[\"~#iM\",[\"loading\",false,\"auth\"]]"` );
这里外层双引号里的\"会被JavaScript先解析成普通的",所以实际存进localStorage的内容是"["~#iM",["loading",false,"auth"]]"——这是一个被额外引号包裹的字符串,内部的引号没有转义,结构根本不是合法的JSON,自然解析失败。
而你测试的JSON.parse("[\"~#iM\",[\"loading\",false,\"auth\"]]")能成功,是因为这个字符串在JavaScript里被解析后,实际传给JSON.parse的是["~#iM",["loading",false,"auth"]],这才是标准的JSON格式。
最后再划个重点
- 存数据:JS对象 →
JSON.stringify()→ 存入localStorage - 取数据:从localStorage取字符串 →
JSON.parse()→ JS对象 - 永远别手动写JSON字符串,转义、格式这些细节交给内置API处理就好
内容的提问来源于stack exchange,提问作者alo gon

