如何修复SyntaxError:JSON中位置0处的意外令牌b

时间:2019-04-26 10:45:41

标签: angular spring-boot spring-mvc angular-httpclient

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

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

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

Screenshot of console

这是我在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);
}

2 个答案:

答案 0 :(得分:0)

可能是您没有获得正确的JSON对象。请检查api响应并确认正确的JSON来自api

答案 1 :(得分:0)

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

默认情况下,Spring在返回字符串时使用StringHttpMessageConverter,这意味着它将仅返回字符串并使用text/plain,例如foo@example.com

这意味着响应将不是有效的JSON。要将其转换为有效的JSON,您需要使用其他引号,例如"foo@example.com"

解决方案是:

  1. 从后端返回JSON响应。这可以通过将响应(电子邮件)包装在一个类中来完成。一旦返回对象,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上,从而将响应转换为有效的JSON字符串。可以在this answer中找到解决方案。

  4. 或者,您可以在响应中添加其他引号。例如,通过在Spring控制器中返回"\"foo@example.com\""