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

如何从存储JS对象的MySQL列中获取有效JSON?

问题根源与解决办法:Http failure during parsing 及无效JSON返回

我来帮你拆解这个问题,其实根源就在JSON字符串的转义和SQL插入的方式上,咱们一步步分析:

问题到底出在哪?

看你贴的Postman返回结果,book字段的值是"{ "title": "hello world"... }"——这里面的双引号没有被转义!当后端把这个结果包装成外层JSON返回时,外层的双引号和book值里的双引号直接冲突了:比如"book": "{ "title": ... }"这段,解析器会认为"{ 之后的"是字符串的结束符,剩下的title": ...就成了无效的JSON语法,自然会报解析错误。

为什么会出现这个情况?因为你插入数据时是直接把JSON.stringify()后的字符串拼到SQL语句里,没有做任何转义处理。MySQL存储字符串时,如果内容包含双引号,必须转义成\"才能保证字符串的完整性;直接拼接的话,虽然数据能存进库,但查询出来的字符串里的双引号会直接破坏外层JSON的结构。

怎么解决,拿到有效JSON?

1. 插入时用参数化查询(最推荐、最安全的方式)

绝对不要再用字符串拼接的方式写SQL!不仅会导致你现在遇到的转义问题,还存在严重的SQL注入风险。改用参数化查询,数据库驱动会自动帮你处理字符串的转义。

比如用Node.js的mysql2库的话,代码应该改成这样:

// 假设你用的是mysql2连接池
const insertQuery = 'INSERT INTO library (id, category, book, authors) VALUES (?, ?, ?, ?)';
// 把JSON序列化后的字符串作为参数传入,驱动会自动转义
const insertValues = [
  obj.id, 
  obj.category, 
  JSON.stringify(book), 
  JSON.stringify(authors)
];

// 执行参数化查询
connection.query(insertQuery, insertValues, (err, results) => {
  if (err) throw err;
  console.log('数据插入成功');
});

这样存到数据库里的book和authors字段内容,里面的双引号都会被转成\",查询出来后就能被正确包裹进外层JSON里。

2. 后端查询时解析JSON字段再返回

就算数据库里存的是转义后的JSON字符串,后端返回给前端之前,最好先把这些字符串解析成JSON对象/数组,这样前端拿到的就是直接可用的结构化数据,不用再手动处理。

比如后端(Node.js示例)处理查询结果的代码:

// 查询数据
const selectQuery = 'SELECT book, authors FROM library WHERE id = ?';
const [rows] = await connection.query(selectQuery, [targetId]);

// 把字符串类型的JSON解析成对象/数组
const processedData = rows.map(row => ({
  book: JSON.parse(row.book),
  authors: JSON.parse(row.authors)
}));

// 返回处理后的JSON给前端
res.json(processedData);

这样前端收到的响应就是标准的JSON结构,Angular的HTTP客户端会自动解析,不会再报“Http failure during parsing”错误。

3. 临时前端修复方案(不推荐,仅应急用)

如果后端暂时没法修改,前端可以手动修复返回的字符串,再解析。但这个方法有边缘风险(比如字符串里本来就有转义的引号会被误处理),只能作为临时方案:

// 假设response是你从后端拿到的数组
response.forEach(item => {
  // 修复未转义的双引号:把不是转义后的"替换成\"
  const fixedBookStr = item.book.replace(/(?<!\\)"/g, '\\"');
  item.book = JSON.parse(fixedBookStr);
  
  const fixedAuthorsStr = item.authors.replace(/(?<!\\)"/g, '\\"');
  item.authors = JSON.parse(fixedAuthorsStr);
});

总结

核心问题就是插入时未转义JSON字符串的双引号,导致存储的内容破坏了返回JSON的语法结构。最稳妥的解决方式是用参数化查询插入数据,同时后端查询时解析JSON字段再返回,这样前端就能拿到完全有效的JSON了。

内容的提问来源于stack exchange,提问作者Kingsley

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:36:56