You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 10:48:02