JSON.parse在字符串中包含换行符时会产生异常。

7

我得到了以下字符串:

var str='{"message":"hello\nworld"}';

我需要将其转换为JSON对象。然而,当我尝试使用 JSON.parse(str) 时,由于 \n 导致了异常。

我看到了这个问题,但没有帮助。

从那里,我尝试了 var j=JSON.parse(JSON.stringify(str))

但是当我使用 typeof j 时,我仍然得到字符串而不是对象。

我知道使用 \\n 可以解决问题,但问题是,当我需要使用该值时,它不会打印在新的一行。

更新: 好吧,我刚刚意识到 \\n 是有效的。 我正在使用此方法将 \n 转换为 \\n:

var str='{"message":"hello\nworld"}';
str=str.replace(/\n/g, "\\\\n").replace(/\r/g, "\\\\r").replace(/\t/g, "\\\\t");

var json=JSON.parse(str);

console.log(json.message);

有人能否帮忙纠正一下吗?


3
我知道使用 \\n 是可以的,但问题是,当我需要使用这个值时它并不会在新的一行上打印。你需要修复的部分是 - 在这里使用 \\n 是正确的,假设你想让 "message" 包含一个新的换行符,因为换行本身在JSON中是无效的。 - James Thorpe
1
@PawanNogariya 这是一个字符串,我不会使用它来形成 HTML 标签。我是从我的 Web 服务中获取数据。 - Dushyant Bangal
我会在控制台中打印一个新行,看这个 fiddle https://jsfiddle.net/s8d8k3on/ - Pawan Nogariya
@DushyantBangal,您问题中的代码会导致 j.messageundefined - James Thorpe
我认为你的更新只会让你的情况变得更糟。如果你的字符串确实需要换行符或制表符(例如,如果它是漂亮格式化的JSON),那么现在你就无法这样做,并且会得到不同的错误。你能否修改原始输出JSON以首先输出\\n?正如我之前提到的,JSON值中的换行符在第一位就是无效的,因此提供给你该JSON输出的任何内容都是不正确的。一旦你解决了这个问题,就可以继续解决其他问题,比如在你遇到问题的地方正确显示换行符。 - James Thorpe
显示剩余5条评论
1个回答

13

\n 转义为 \\n 是正确的做法。在你的代码中,替换调用是有问题的。你需要减少反斜杠。更新你的代码:

var str='{"message":"hello\nworld"}';
str=str.replace(/\n/g, "\\n").replace(/\r/g, "\\r").replace(/\t/g, "\\t");

var json=JSON.parse(str); //No errors due to escaping

现在打印它,您将看到文本被分割成不同的行。
console.log(json.message);

这是一个字符串,我不会使用它来形成HTML标签。我正在从我的Web服务中获取数据。我需要将其存储在我的数据库中。这不是用于在浏览器上显示。 - Dushyant Bangal
你可以将它存储在你的数据库中,这不会有问题。如果你想解决它在浏览器上没有显示的问题,在打印之前使用我在答案中写过的函数即可。例如:document.write(nl2br("hello\nworld")) - EnKrypt
我的总体目标非常不同。太大了,无法解释我究竟想做什么。只需要让涉及的UPDATE代码正常工作即可。 - Dushyant Bangal
2
如我在评论中提到的,这可能会将问题转移至其他地方。如果外部系统开始返回一个仍然是有效JSON(例如)格式化后的字符串,例如:'{\n\t"message":"hello world"\n}',这个解决方案将会引入错误,因为您最终会尝试解析'{\\n\\t"message":"hello world"\\n}',而这已经不再有效。@DushyantBangal你的第一步应该至少是_询问_其他系统上的开发人员。修复对他们来说可能是微不足道的,并且是正确、最强大的长期修复方法 - James Thorpe
@JamesThorpe - 同意。我假设 OP 对由 API 端点生成的内容没有控制权。如果不是这种情况,他一开始就不应该有原始问题。 - EnKrypt
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接