位置0的JSON中出现意外的u令牌。

16

当我尝试将字符串转换为对象时,出现错误 ``:

Unexpected token u in JSON at position 0

服务

setUser : function(aUser){ 
    //sauvegarder User       
    localStorage.setItem('User', JSON.stringify(aUser));
},

getUser : function(){
    //récuperer User      
    return JSON.parse(localStorage.getItem('User'));
}

请展示您正在尝试解析的字符串。 - Don Branson
你的http调用中可能有dataType: 'json'或responseType: 'json'。似乎Angular无法解析它(因为它不是有效的JSON格式)。尝试将它们移除。 - sandiejat
3个回答

13
首先要做的是查看你想解析的内容。我猜你会发现它是无效的JSON,即"undefined"。你得到了undefined,因为你还没有在本地存储中保存任何键值。undefined然后被转换成字符串"undefined"JSON.parse不能解析它。
我通常像这样在本地存储中存储和检索东西:
存储(与你的方式相同):
localStorage.setItem("key", JSON.stringify(thing));

获取(这与以往不同)

thing = JSON.parse(localStorage.getItem("key") || "null");
if (!thing) {
    // There wasn't one, do whatever is appropriate
}

那样,我总是解析一些有效的东西。

7
您会收到此错误是因为您没有将响应作为JSON字符串返回,而您的浏览器期望解析JSON字符串。因此它会取响应字符串的第一个字母并抛出错误。
您可以通过进入浏览器开发工具的网络选项卡并查看响应来验证它。
要解决此问题,您可以在HTTP请求中使用以下代码。
var promiz = $http.post(url, data, {
      transformRequest: angular.identity,
      transformResponse: angular.identity,
      headers: {
        'Content-Type': undefined
      }
    });

希望这能帮到您!

1
最佳解决方案,在我从angularJS 1.2升级到1.3时正常工作。 - Verri

5
我也遇到了同样的错误。问题在于我从HTTP Get请求中获取的响应不是JSON格式,而是纯文本。
this.BASE_URL = "my URL";

public getDocument() {
    return this.http.get(this.BASE_URL)
      .map((res: Response) => res.json())
      .catch((error: any) => Observable.throw(error.json().error || 'Server error'));
}

所以,JSON解析器出现了错误。
当我将其映射为纯文本时,如下所示:
.map((res: Response) => res.text());

它可以正常工作。


1
在升级到Angular 6之后,您不再需要映射到JSON。请从HttpModule和Http服务切换到HttpClientModule和HttpClient服务。HttpClient简化了默认的人机工效学(您不再需要映射到json),现在支持类型返回值和拦截器。更多信息请参见angular.io。 - harishkumar329

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