JavaScript解析SQL输出字符串报错:无法读取键值、JSON位置1出现意外token i
问题根因
你拿到的字符串不属于合法JSON格式,JSON语法有两个强制要求:
- 所有对象键必须用双引号包裹
- 所有字符串类型的值必须用双引号包裹
你当前的字符串{id:2,name_of_division:'super department1',attendance_radius:1000}既没有给键加双引号,字符串值用的是单引号,完全不符合JSON规范,所以JSON.parse会直接抛出语法错误。
同时你直接读取键值返回undefined的原因也很简单:clean_div_array_var[i]本身是字符串类型,不是JS对象,自然不存在对应的属性。你之前尝试序列化再删引号的操作,只是把外层多包的一层引号去掉,原字符串的非法格式没有任何修正,所以还是会报错。
解决方案
方案1:从SQL输出端直接生成合法JSON(优先推荐)
不要手动拼接JSON格式字符串,直接用数据库内置的JSON生成函数,从源头输出符合规范的JSON:
- MySQL:使用
JSON_OBJECT函数,示例:
SELECT JSON_OBJECT( 'id', id, 'name_of_division', name_of_division, 'attendance_radius', attendance_radius ) AS div_info FROM 你的表名
- PostgreSQL:使用
row_to_json或者json_build_object函数
其他数据库均有对应原生JSON生成函数,直接调用即可,输出的内容前端可以直接用JSON.parse解析。
方案2:前端兼容处理(无法修改SQL时使用)
方法A:利用JS语法直接解析(简单高效)
直接把字符串作为JS对象表达式返回:
const rawStr = clean_div_array_var[i]; const divObj = new Function(`return ${rawStr}`)(); // 之后直接读取属性即可 console.log(divObj.id); // 输出2 console.log(divObj.name_of_division); // 输出super department1
注意:如果字符串内容来自不可信的用户输入,该方法存在XSS注入风险,仅适合内部系统、内容完全可控的场景使用。
方法B:正则转换为合法JSON再解析
用正则把非法格式修正为符合JSON规范的格式后再解析:
const rawStr = clean_div_array_var[i]; // 先把单引号替换为双引号,再给所有对象键加双引号 const validJson = rawStr .replace(/'/g, '"') .replace(/([{,]\s*)(\w+)(\s*:)/g, '$1"$2"$3'); const divObj = JSON.parse(validJson); // 读取属性 console.log(divObj.attendance_radius); // 输出1000
内容的提问来源于stack exchange,提问作者Axil
相关产品推荐
相关产品推荐

