web-dev-qa-db-ja.com

位置0のJSONの予期しないトークンu

文字列をオブジェクトに変換しようとすると、エラーが発生します ``:

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'));
}
13
nevergiveup

最初に行うことは、解析しようとしているものを調べることです。私の推測では、それは"undefined"であり、これは無効なJSONです。ローカルストレージのキーに(まだ)何も保存していないため、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
}

そのようにして、私は常に有効なものを解析しています。

12
T.J. Crowder

ブラウザがJSON文字列の解析を期待しているときに、JSON文字列として応答を返さないため、このエラーが発生します。したがって、応答文字列の最初の文字を取得してエラーをスローしています。

ブラウザの開発ツールの[ネットワーク]タブに移動し、応答を表示することで確認できます。

この問題を解決するには、httpリクエストで以下のコードを使用できます。

var promiz = $http.post(url, data, {
      transformRequest: angular.identity,
      transformResponse: angular.identity,
      headers: {
        'Content-Type': undefined
      }
    });

お役に立てれば!

6

私も同じエラーを受け取っていました。問題は、HTTP Get Requestから取得した応答が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());

できます。

5
Aarchie