如何修复 SyntaxError:Unexpected token < in JSON at position 0

SyntaxError:Unexpected token < in JSON at position 0 错误表示 HTTP 请求需要 JSON 响应,但却收到了非 JSON 数据。

假设您可以访问发送请求的代码,通过添加将错误和响应数据记录到控制台的错误处理逻辑来进一步调查和调试。日志记录方法取决于 JavaScript 代码是使用 fetch() 还是 JSON.parse()。


本文介绍 SyntaxError: Unexpected token < in JSON at position 0 错误的故障排除指南,以及常见的变体:

是什么导致了这个错误?

当请求需要 JSON 响应,但实际响应为其他格式时,就会出现此错误。JSON 解析器在检测到无效响应时会抛出一个错误。

此错误的可能根本原因包括:

在许多情况下,意外的响应是包含服务器端错误细节的 HTML 或 XML。

如何修复?

添加错误处理代码,并将错误和响应数据记录到控制台,以调查为什么没有收到有效的 JSON。如何记录数据取决于代码是使用 fetch() 还是 JSON.parse()

常见的根本原因及其解决方案包括:

fetch() 记录响应数据

JavaScript fetch() 函数可能类似于以下内容:

Javascript 代码块显示了一个对示例 URL 的 Fetch API 请求,一个返回响应的 JSON 的 promise,以及一个对数据进行处理的 promise。 fetch('https://example.com/some/path/to/json') .then(response => response.json()) .then(data => console.log(data))

错误发生在调用 response.json() 时,且数据无法解析为 JSON 格式。例如,响应可能是 HTML 或 XML。

通过创建响应的克隆并添加一个处理错误的函数,将数据打印到控制台:

Javascript 代码块,行号显示对示例 URL 的 Fetch API 请求,一个 promise 克隆响应并返回其 JSON,另一个 promise 处理数据并记录错误。 Line 1: let responseClone; Line 2: fetch('https://example.com/some/path/to/json') Line 3: .then(response => { Line 4: responseClone = response.clone(); Line 5: return response.json(); Line 6: }) Line 7: .then(data => console.log(data)) Line 8: .catch(error => { Line 9: console.log('Error parsing JSON from response:', error, responseClone); Line 10: responseClone.text() Line 11: .then(text => console.log('Received the following instead of valid JSON: ', text)) Line 12: }

response 对象只能读取一次。因此,我们希望在原始响应在第 5 行被读取之前,先创建它的克隆并打印到控制台。

在第 8 行,我们添加了一个错误处理函数。如果 response.json() 失败,则调用此函数并记录错误和 responseClone 数据,以供进一步检查。

记录 JSON.parse() 的响应

如果代码使用 JSON.parse(data),请通过添加 try…catch 语句来处理错误并将响应数据记录到控制台:

显示 try-catch 语句的 Javascript 代码块。Try 块调用 JSON.parse(data),catch 块将错误记录到控制台。try { JSON.parse(data); } catch (error) { console.log('Error parsing JSON:', error, data); }