キャッチされないSyntaxError:JSON.parseを含む予期しないトークン


190

3行目のこのエラーの原因は何ですか?

var products = [{
  "name": "Pizza",
  "price": "10",
  "quantity": "7"
}, {
  "name": "Cerveja",
  "price": "12",
  "quantity": "5"
}, {
  "name": "Hamburguer",
  "price": "10",
  "quantity": "2"
}, {
  "name": "Fraldas",
  "price": "6",
  "quantity": "2"
}];
console.log(products);
var b = JSON.parse(products); //unexpected token o

コンソールを開いてエラーを表示


16
JSONがありませんか?これは配列/オブジェクトリテラルです。
ベルギ2013年

回答:


219

productsオブジェクトです。(オブジェクトリテラルから作成)

JSON.parse()JSON表記を含む文字列をJavaScriptオブジェクトに変換するために使用されます。

コードは、オブジェクトを.toString()JSONテキストとして解析するために、オブジェクトを(を呼び出すことにより)文字列に変換します。
デフォルト.toString()はを返しますが"[object Object]"、これは有効なJSONではありません。したがってエラー。


1
配列ではありませんか?なぜそれがオブジェクトなのか。オブジェクトは{で始まり、配列は[?または私はここで間違っています

4
配列はオブジェクトです。それ.toString()が戻ります(仕様に従って)。
2016

1
最初にオブジェクトを文字列化する解決策はありますか?
Mohammed Noureldin

6
@MohammedNoureldin:いいえ。解決策は、何もせずにオブジェクトを使用することです。
2018

1
Ajaxを使用してリモートサービスからデータを取得すると、Jsonの応答が返されますか?そして、その応答をJavaScript配列オブジェクトに保存したいですか?
Mohammed Noureldin 2018

126

それが有効なJSONであることがわかっているが、まだこれを取得しているとしましょう...

その場合、それを取得するソースに関係なく、文字列に非表示/特殊文字が含まれている可能性があります。バリデーターに貼り付けると失われますが、文字列ではまだ残っています。それらの文字は見えないが壊れるJSON.parse()

s未加工のJSONの場合は、次のコードでクリーンアップします。

// preserve newlines, etc - use valid JSON
s = s.replace(/\\n/g, "\\n")  
               .replace(/\\'/g, "\\'")
               .replace(/\\"/g, '\\"')
               .replace(/\\&/g, "\\&")
               .replace(/\\r/g, "\\r")
               .replace(/\\t/g, "\\t")
               .replace(/\\b/g, "\\b")
               .replace(/\\f/g, "\\f");
// remove non-printable and other non-valid JSON chars
s = s.replace(/[\u0000-\u0019]+/g,""); 
var o = JSON.parse(s);

エラーが発生し、文字列内の奇妙な文字まで追跡しました。無効なJSON文字を削除する方法を使用したところ、うまくいきました。
albertski、2015

1
今ここに二度来ました。thnx
ベンジャミンホフマン

Base64デコード後に末尾の特殊文字を取得しました。あなたの方法は私を大いに助けてくれました!Thx
Guillaume

無効なJSONで応答するソースを信頼しないでください。データが破損していることを通知してください。彼らはそれを修正する必要があります。このような方法で応答を「回復」しようとすると、通信が不安定になります。
OnurYıldırım2016

すべての制御文字を置き換えるs = s.replace(/[\u0000-\u001F]+/g,""); にはs = s.replace(/[\u0000-\u0019]+/g,""); 、の代わりにする必要があります。正しい?
HongchaoZhang

63

オブジェクトを文字列化したいようです。これを行います:

JSON.stringify(products);

エラーの理由JSON.parse()は、String値を期待し、productsであることArrayです。

注:後にjson.parse('[object Array]')トークンoを期待していなかったと文句を言う試みをすると思います[


28

で同じ問題が見つかりましたJSON.parse(inputString)

私の場合、入力文字列はサーバーページから返されます[ページメソッドの戻り]

私は印刷されたtypeof(inputString)-それは、文字列だった、まだエラーが発生します。

私も試しましたがJSON.stringify(inputString)、役に立ちませんでした。

後で、これが[\n]フィールド値内の新しい行演算子の問題であることがわかりました。

私は[他の文字に置き換え、解析後に新しい行を戻す]置換を行い、すべてが正常に動作しています。


2
改行文字も問題でした。では、どうすればそのようなデータを復元できるでしょうか。
kolenda 2013

@kolenda無効なJSONがあります。有効なJSONを返す実際のJSONシリアライザーを使用するようにサーバーを変更する必要があります。
2013年

同様の問題がありましたが、「\ n」の代わりにパス内に「\ e」がありました(「\」の代わりに「/」を使用するようにサーバー側のコードを変更し、すべてが再び機能していました)
Adam Tal

エスケープを使用して、\ nが\\ nになるようにします
Paul Gregoire '23 / 09/23

13

JSON.parseはパラメーター内のストリングを待機しています。問題を解決するには、JSONオブジェクトを文字列化する必要があります。

products = [{"name":"Pizza","price":"10","quantity":"7"}, {"name":"Cerveja","price":"12","quantity":"5"}, {"name":"Hamburguer","price":"10","quantity":"2"}, {"name":"Fraldas","price":"6","quantity":"2"}];
console.log(products);
var b = JSON.parse(JSON.stringify(products));  //solves the problem

12
products = [{"name":"Pizza","price":"10","quantity":"7"}, {"name":"Cerveja","price":"12","quantity":"5"}, {"name":"Hamburguer","price":"10","quantity":"2"}, {"name":"Fraldas","price":"6","quantity":"2"}];

への変更

products = '[{"name":"Pizza","price":"10","quantity":"7"}, {"name":"Cerveja","price":"12","quantity":"5"}, {"name":"Hamburguer","price":"10","quantity":"2"}, {"name":"Fraldas","price":"6","quantity":"2"}]';

2
@SLaksはい、OPは製品を直接使用できます。しかし、彼がuseを使いたい場合JSON.parse、引数は文字列である必要があります。
pktangyue 2013年

'はコメントなので、ASPクラシックで何をすべきか
アシシュバット

1
@ashishbhatt "を使用してから、他のすべての"を\ "に変更する
pktangyue

2
このようなものJSON.parse(products.replace(/'/g, '"'))
ケミカルプログラマー

10

ここで JSON文字列を検証する必要があります。

有効なJSON文字列では、キーを二重引用符で囲む必要があります。

JSON.parse({"u1":1000,"u2":1100})       // will be ok

引用符がない場合、エラーが発生します。

JSON.parse({u1:1000,u2:1100})    
// error Uncaught SyntaxError: Unexpected token u in JSON at position 2

一重引用符を使用すると、エラーが発生します。

JSON.parse({'u1':1000,'u2':1100})    
// error Uncaught SyntaxError: Unexpected token ' in JSON at position 1

私の場合、Grails 2.5.6 render ([key: value])は単一引用符でレンダリングされ、jquery Ajaxの位置1でJSON parseErrorが発生しました。render (groovy.json.JsonOutput.toJson ([key:value]))私を助けた。
philburns


3
[
  {
    "name": "Pizza",
    "price": "10",
    "quantity": "7"
  },
  {
    "name": "Cerveja",
    "price": "12",
    "quantity": "5"
  },
  {
    "name": "Hamburguer",
    "price": "10",
    "quantity": "2"
  },
  {
    "name": "Fraldas",
    "price": "6",
    "quantity": "2"
  }
]

これが、パースできる完璧なJsonです。


3

以前の返信に基づいて作成した関数は次のとおりです。私のマシンでは機能しますが、YMMVです。

          /**
             * @description Converts a string response to an array of objects.
             * @param {string} string - The string you want to convert.
             * @returns {array} - an array of objects.
            */
            function stringToJson(input) {
              var result = [];

              //replace leading and trailing [], if present
              input = input.replace(/^\[/,'');
              input = input.replace(/\]$/,'');

              //change the delimiter to 
              input = input.replace(/},{/g,'};;;{');

              // preserve newlines, etc - use valid JSON
              ///programming/14432165/uncaught-syntaxerror-unexpected-token-with-json-parse
            input = input.replace(/\\n/g, "\\n")  
            .replace(/\\'/g, "\\'")
            .replace(/\\"/g, '\\"')
            .replace(/\\&/g, "\\&")
            .replace(/\\r/g, "\\r")
            .replace(/\\t/g, "\\t")
            .replace(/\\b/g, "\\b")
            .replace(/\\f/g, "\\f");
            // remove non-printable and other non-valid JSON chars
            input = input.replace(/[\u0000-\u0019]+/g,""); 

              input = input.split(';;;');

              input.forEach(function(element) {
                // console.log(JSON.stringify(element));

                result.push(JSON.parse(element));
              }, this);

              return result;
            }

2

"SyntaxError: Unexpected token"呼び出し時に例外が発生する可能性があるもう1つの問題JSON.parse()は、文字列値で次のいずれかを使用していることです。

  1. 改行文字。

  2. タブ(はい、タブキーで作成できるタブです!)

  3. スタンドアロンスラッシュ\(ただし、何らかの理由/で、少なくともChromeでは使用できません。)

(完全なリストについては、ここ文字列セクションを参照してください。)

たとえば、次の場合はこの例外が発生します。

{
    "msg" : {
        "message": "It cannot
contain a new-line",
        "description": "Some discription with a     tabbed space is also bad",
        "value": "It cannot have 3\4 un-escaped"
    }
}

したがって、次のように変更する必要があります。

{
    "msg" : {
        "message": "It cannot\ncontain a new-line",
        "description": "Some discription with a\t\ttabbed space",
        "value": "It cannot have 3\\4 un-escaped"
    }
}

つまり、JSONのみの形式では、大量のテキストが含まれるため、読みにくくなります。



1

うまくいけば、これは他の誰かを助けます。

私の問題は、コメントを解析して無効なJSONを返すAJAXを介してPHPコールバック関数でHTMLにコメントしたことです。

コメントされたHTMLを削除すると、すべてが問題なく、JSONは問題なく解析されました。


0

productsは、直接使用できる配列です。

var i, j;

for(i=0;i<products.length;i++)
  for(j in products[i])
    console.log("property name: " + j,"value: "+products[i][j]);

0

今どうやら\r\b\t\f、などがあなたにこのエラーを与えることができる唯一の問題文字ではありません。

一部のブラウザでは、の入力に追加の要件がある場合がありJSON.parseます。

ブラウザでこのテストコードを実行します。

var arr = [];
for(var x=0; x < 0xffff; ++x){
    try{
        JSON.parse(String.fromCharCode(0x22, x, 0x22));
    }catch(e){
        arr.push(x);
    }
}
console.log(arr);

ChromeでテストしたJSON.parse(String.fromCharCode(0x22, x, 0x22));ところx、34、92、または0〜31のwhere は許可されていません。

Chars 34と92はそれぞれ"\文字で、通常は期待され、適切にエスケープされます。問題が発生するのは0から31の文字です。

デバッグを支援するために、行う前にJSON.parse(input)、まず入力に問題のある文字が含まれていないことを確認します。

function VerifyInput(input){
    for(var x=0; x<input.length; ++x){
        let c = input.charCodeAt(x);
        if(c >= 0 && c <= 31){
            throw 'problematic character found at position ' + x;
        }
    }
}

0

JSON.parseが必要な理由 すでにオブジェクト形式の配列になっています。

以下のようにJSON.stringifyを使用することをお勧めします。 var b = JSON.stringify(products);

これはあなたを助けるかもしれません。


0

ああ、これまでに提供された上記のすべての回答の解決策は私にはうまくいきませんでした。今ちょうど同じような問題がありました。私はなんとかしてラッピングで解決しました。スクリーンショットをご覧ください。うわ。

ここに画像の説明を入力してください

元の:

var products = [{
  "name": "Pizza",
  "price": "10",
  "quantity": "7"
}, {
  "name": "Cerveja",
  "price": "12",
  "quantity": "5"
}, {
  "name": "Hamburguer",
  "price": "10",
  "quantity": "2"
}, {
  "name": "Fraldas",
  "price": "6",
  "quantity": "2"
}];
console.log(products);
var b = JSON.parse(products); //unexpected token o


0

あなたが得ているエラー、すなわち「予期しないトークンo」は、jsonが予期されているが、解析中にオブジェクトが取得されるためです。その「o」は「object」という単語の最初の文字です。


0

あなたがしている唯一の間違いは、あなたはすでにパースされたオブジェクトをパースしているので、それがエラーを投げているということです、これを使って、あなたは行ってもいいでしょう。

var products = [{
  "name": "Pizza",
  "price": "10",
  "quantity": "7"
}, {
  "name": "Cerveja",
  "price": "12",
  "quantity": "5"
}, {
  "name": "Hamburguer",
  "price": "10",
  "quantity": "2"
}, {
  "name": "Fraldas",
  "price": "6",
  "quantity": "2"
}];
console.log(products[0].name); //name of item at 0th index

JSON全体を印刷したい場合は、JSON.stringify()を使用してください


0

これはさまざまな理由で発生する可能性がありますが、おそらく無効な文字であるため、これを使用JSON.stringify(obj);してオブジェクトをJSONに変換できますが、それはJQUERY式であることを覚えておいてください。


0

jsonオブジェクトを返すAPIがエラー(私の場合はコードイグナイター、phpコードが失敗したときにhtmlを返す)を与えていたため、このエラーが発生したため、JSONオブジェクトではありません。

SQL文とPHPコードを確認し、Postman(または他のAPIテスター)でテストします


0

私が行っていた間違いはnull、JSON.parse()に(無意識のうちに)渡すことでした。

それで投げた Unexpected token n in JSON at position 0


-24

を使用しevalます。JavaScriptの式/コードを文字列として受け取り、評価/実行します。

eval(inputString);

eval()を呼び出すたびに、JavaScriptインタープリターの新しいインスタンスが作成されます。これはリソースを独占する可能性があります。
Yëco
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.