SyntaxError:JSONの位置1に予期しないトークンo


139

コントローラーの型クラスを使用していくつかのデータを解析し、次のようにデータを取得しています。

{  
   "data":{  
      "userList":[  
         {  
            "id":1,
            "name":"soni"
         }
      ]
   },
   "status":200,
   "config":{  
      "method":"POST",
      "transformRequest":[  
         null
      ],
      "transformResponse":[  
         null
      ],
      "url":"/home/main/module/userlist",
      "headers":{  
         "rt":"ajax",
         "Tenant":"Id:null",
         "Access-Handler":"Authorization:null",
         "Accept":"application/json, text/plain, */*"
      }
   },
   "statusText":"OK"
}

このようなデータを保存してみました

var userData = _data;
var newData = JSON.parse(userData).data.userList;

ユーザーリストを新しい変数に抽出するにはどうすればよいですか?


11
を使用する必要はありませんJSON.parseuserDataオブジェクトとして直接使用してみてください。
Mohit Bhardwaj

13
表示される場合console.log(typeof userData)object、解析する必要のあるJSON文字列ではなく、JavaScriptオブジェクトがすでに存在します。
t.niese

1
...はい、必要性解析のために必要ではない@MohitBhardwaj
Soniyaモハン

5
通常Unexpected token o in JSON、このエラーが発生するときはいつでも- おそらく、すでに解析済みの形式のオブジェクトを解析しようとしている可能性があります。
Mohit Bhardwaj

@mohitbhardwaj大丈夫です!
Soniya Mohan

回答:


191

投稿したJSONは問題ないように見えますが、コードではおそらくJSON文字列ではなく、すでにJavaScriptオブジェクトです。つまり、これ以上の解析は必要ありません。

これを自分でテストすることができます(例:Chromeのコンソール)。

new Object().toString()
// "[object Object]"

JSON.parse(new Object())
// Uncaught SyntaxError: Unexpected token o in JSON at position 1

JSON.parse("[object Object]")
// Uncaught SyntaxError: Unexpected token o in JSON at position 1

JSON.parse()入力を文字列に変換します。toString()JavaScriptオブジェクトのメソッドはデフォルトでを返し[object Object]、結果として動作が観察されます。

代わりに以下を試してください:

var newData = userData.data.userList;

1
これはあらゆる種類のブラウザに適用できますか?
comeOnGetIt 2017年

@Timoこのリンクを見ていただけませんか。
V SH

このエラーは、リクエストを処理するAPI URLエンドポイントのコードまたはその他のインクルードファイルや使用ファイルにエラーがあり、処理または記録されていないエラーをスローした場合に発生することがあります。ほとんどの場合、ブラウザ開発者ツールのネットワークタブを見るか、post manを使用してエンドポイントにアクセスし、何が発生するかを確認すると、これを取得できます。
MuturiAlex

65

関数の最初のパラメータはJSON.parse文字列でなければならず、データはJavaScriptオブジェクトであるため、文字列[object object]に変換されます。JSON.stringifyデータを渡す前に使用する必要があります

JSON.parse(JSON.stringify(userData))

1
グレート助けられた仲間。ありがとう:)
Anand_5050

それは助けになりました。解決策をありがとう。
Nag Arjun

あなたは私の一日の仲間を救った。ありがとう:)
ドワーケソニ

文字列に二重引用符が含まれている場合、これは機能しません。解決策はありますか
Mr S Coder

23

ブロックでJSON.parseラップせずに使用しないでくださいtry-catch

// payload 
let userData = null;

try {
    userDate = JSON.parse(payload); 
} catch (e) {
    // You can read e for more info
    // Let's assume the error is that we already have parsed the payload
    // So just return that
    userData = payload;
}

// Now userData is the parsed result

7
これは実際には質問の答えにはなりませんが、例外処理の欠如についてコメントしています。
Richard Duerr

2
@RichardDuerr、しかしこれはヘッドトピックのエラーを修正するのに役立ちます。ie SyntaxError:JSONの予期しないトークンoの位置1
Niko Jojo

6
これは単にエラーを隠すだけで、実際には解決しません。
Richard Duerr

21

すぐ上でJSON.parse、次を使用:

var newData = JSON.stringify(userData)

4
JSON.stringify()JavaScriptオブジェクトを文字列表現に変換しますJSON.parse()。これは、何をするかとは逆です。SyntaxError既にオブジェクトである何かを解析しようとしていたので、あなたはそれを手に入れていました。@Sukhchainのソリューションでは、それを回避するために文字列に変換されます。
Hubert

1
その欠点は、結局、JSON.parse()冗長に使いすぎていることです。これはかなり高速なプロセスですが、JSONの解析は同期的に行われ、UIをブロックする可能性があるため、使用しないことをお勧めします。代わりに、たとえば、変数typeof(userData) === 'object'を解析する前にを使用して、変数がオブジェクトかどうかを確認できます。
Hubert

2

まあ、私はこのようにオブジェクトを解析する必要があることを意味しました:var jsonObj = {"first name" : "fname"}。しかし、実際にはそうではありません。それはすでにJSONだからです。


2

次のようなチェックを追加することもできます。

function parseData(data) {
    if (!data) return {};
    if (typeof data === 'object') return data;
    if (typeof data === 'string') return JSON.parse(data);

    return {};
}

1

JSONデータまたは文字列がたまたま解析されると、予期しない「O」エラーがスローされます。

文字列の場合、すでに文字列化されています。解析すると、予期しない「O」エラーが発生します。

私は似ていますが(状況は異なりますが)、JSONプロデューサーを削除して次のエラーを解決しました。

    @POST
    @Produces({ **MediaType.APPLICATION_JSON**})
    public Response login(@QueryParam("agentID") String agentID , Officer aOffcr ) {
      return Response.status(200).entity("OK").build();

  }

応答には"OK"文字列が含まれています。@Produces({** MediaType.APPLICATION_JSON })** としてマークされた注釈は、文字列をJSON形式に解析しようとしますが、結果として予期ない「O」になりますます。

@Produces({ MediaType.APPLICATION_JSON })を削除しても問題ありません。出力:OK

注意:また、クライアント側では、ajaxリクエストを作成してJSON.parse( "OK")を使用すると、予期しないトークン 'O'がスローされます

Oは文字列の最初の文字です

JSON.parse(object)はjQuery.parseJSON(object);と比較されます。

JSON.parse( '{"name": "Yergalem"、 "city": "Dover"}'); - - 正常に動作します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.