How To Fix SyntaxError: Unexpected token b in JSON at position 0

How To Fix SyntaxError: Unexpected token b in JSON at position 0

我想使用 Spring MVC 从我的后端以字符串形式读取电子邮件地址。但是,当我尝试使用 Angular 的 HttpClient 读取它时,出现以下错误:

SyntaxError: Unexpected token b in JSON at position 0 at JSON.parse

这是控制台中显示的错误的屏幕截图:

这是我在 Angular 中用来读取响应的代码:

public findEmail(username: string): Observable<string> {
  let params = new HttpParams();
  params = params.append('username', username);
  return this.httpClient.get<string>(this.baseUrl + '/findEmail', {params});
}

这是提供响应的 Spring 控制器的代码:

@GetMapping(value = "/findEmail", params = { "username" })
public String findEmail(@RequestParam String username) {
    return utilisateursService.findEmail(username);
}

可能是您没有得到正确的 JSON Object.Check 一旦 api 响应并验证正确的 JSON 来自 api

您没有 JSON 回复,您的回复是纯文本(电子邮件地址),如第一个屏幕截图中的错误所示。

Spring 默认情况下使用 StringHttpMessageConverter 当你 return 一个字符串时,这意味着它将简单地 return 字符串并使用 text/plain,例如 foo@example.com.

这意味着响应将无效 JSON。要将其变成有效的 JSON,您需要使用额外的引号,例如 "foo@example.com".

解决方法是:

  1. 来自后端的 return JSON 响应。这可以通过将响应(电子邮件)包装在 class 中来完成。只要您 return 对象,Jackson 就会将它们序列化为 JSON。例如:

    @GetMapping
    public User getUser() {
        // Response will be { "email": "foo@example.com" }
        return new User("foo@example.com");
    }
    
  2. 或者告诉 HttpClient 使用 responseType 选项将响应解释为纯文本。 the documentation也提到了这一点:

    this.httpClient.get<string>('http://example.org', {responseType: 'text'});
    
  3. 或从现有转换器中删除 StringHttpMessageConverter。这将导致转换回退到 Jackson,Jackson 会将响应转换为有效的 JSON 字符串。可以在 .

  4. 中看到执行此操作的解决方案
  5. 或者,您可以在回复中添加额外的引号。例如,通过在 Spring 控制器中 returning "\"foo@example.com\""