← 全部文章

JSON 中未终止的字符串:原因与修复

JSON 中未终止的字符串意思是有一个开引号却没有闭引号 —— 通常是未转义的引号、原始换行符或被截断的数据。坏例子与修复示例。

SyntaxError: Unterminated string in JSON at position N 表示解析器开始读一个字符串(看到一个开头的 "),然后在找到收尾的 " 之前就走到了输入的末尾 —— 或者撞上了换行。字符串没合上。下面讲讲为什么会这样,以及怎么修。

我遇到的是哪种字符串错误?

错误长什么样

// V8 (Chrome / Node / Edge)
SyntaxError: Unterminated string in JSON at position 27

// Firefox
SyntaxError: JSON.parse: unterminated string at line 2 column 10 of the JSON data

// Safari
SyntaxError: JSON Parse error: Unterminated string

报的位置指向(或紧贴在)那个没合上的字符串开头的引号 —— 从那里往后看。

为什么会这样

原因 1 —— 未转义的引号提前结束了字符串

值里出现一个普通的 " 会提前结束字符串;这一行剩下的部分就被当成意外 token 读,而真正的那个字符串就被「敞着」了。

// ❌ 坏了 —— hello 前面那个引号把 "He said " 给关了
{ "note": "He said "hello" to her" }

// ✅ 修好 —— 内部引号用反斜杠转义
{ "note": "He said \"hello\" to her" }

原因 2 —— 字符串里有原始换行

JSON 字符串里不能直接跨越原始换行。一个字面换行会把字符串截断,让它处于未闭合状态。

// ❌ 坏了 —— 字符串里有真正的换行
{ "bio": "line one
line two" }

// ✅ 修好 —— 用 \n 转义,没有原始换行
{ "bio": "line one\nline two" }

原因 3 —— 数据被截断

响应在字符串中间断掉(连接掉了、缓冲/大小限制、部分读取)会让输入末尾留下一个没合上的字符串。

// 实际收到的(连接掉了):
{"user":{"name":"Ada Lovel
// → Unterminated string

怎么修 —— 一步步来

  1. 跳到报错位置,找到那个没有配对收尾的开头 "
  2. 找值里有没有未转义的 " —— 把它写成 \"
  3. 找值里有没有原始换行/tab —— 把它换成 \n / \t
  4. 检查是不是截断 —— 把字节长度和 Content-Length 比一比;如果短了,说明数据被截断了(要改代码,不是改文本)。
  5. 别再手工拼 JSON 了。JSON.stringify(),它会替你转义引号和控制字符。
// 预防:永远不要拼接字符串得到 JSON
const json = JSON.stringify({ note: userInput }); // 永远合法

常见问题

「Unterminated string in JSON」的原因是什么?

一个开头的 " 没有配对的收尾 " —— 通常是值里有未转义的引号、有原始换行,或者响应在字符串中间被截断。

怎么在 JSON 字符串里包含引号或换行?

把它们转义:双引号用 \",换行用 \n,tab 用 \t。用 JSON.stringify() 来构造 JSON 自动就处理好。

这和「Unexpected end of JSON input」是同一回事吗?

相关但不同。「Unterminated string」表示一个字符串开着没关;「Unexpected end of JSON input」 表示整个结构(对象/数组)提前结束。响应被截断这两种错误都可能触发。

立刻修复