234

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

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

4

24 に答える 24

249

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

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

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

于 2013-01-21T03:36:29.857 に答える
161

それが有効な 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);
于 2014-12-31T19:13:02.453 に答える
74

解析ではなく、オブジェクトを文字列化する必要があるようです。だからこれをしてください:

JSON.stringify(products);

エラーの理由は、 が値をJSON.parse()期待しており、.StringproductsArray

注: の後にjson.parse('[object Array]')トークンを予期していなかったと不平を言う試みだと思います。o[

于 2013-01-21T03:40:16.947 に答える
32

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

私の場合、入力文字列はサーバーページ[return of a page method]から来ています。

を印刷しましたtypeof(inputString)-それは文字列でしたが、それでもエラーが発生します。

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

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

[他の文字に置き換え、解析後に改行を戻す]を行ったところ、すべて正常に動作しています。

于 2013-05-09T07:36:44.403 に答える
25

JSON.parse は String in パラメータを待っています。この問題を解決するには、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
于 2016-10-23T11:09:39.510 に答える
14
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"}]';
于 2013-01-21T03:35:58.497 に答える
2
[
  {
    "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 です。

于 2017-03-06T09:24:42.227 に答える
1

うまくいけば、これは他の誰かに役立ちます。

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

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

于 2015-11-11T01:51:02.687 に答える
1

あなたがしている唯一の間違いは、すでに解析されたオブジェクトを解析しているため、エラーがスローされていることです。これを使用すれば、問題ありません。

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() を使用してください

于 2018-09-14T05:11:48.497 に答える
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);

JSON.parse(String.fromCharCode(0x22, x, 0x22));Chrome でテストしたところx、34、92、または 0 から 31 までは許可されていないことがわかりました。

文字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;
        }
    }
}
于 2017-03-20T15:22:17.007 に答える
0

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

于 2018-07-15T11:54:14.597 に答える
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]);
于 2013-01-21T03:48:56.980 に答える
0

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

于 2018-10-31T12:45:05.057 に答える
0

これは、JSON 形式ではなく、オブジェクトの JavaScript 配列になりました。JSON 形式に変換するには、JSON.stringify()という関数を使用する必要があります。

JSON.stringify(products)
于 2021-04-07T17:20:13.130 に答える
-1

私が行っていた間違いは、null(知らないうちに) JSON.parse() に渡していたことです。

だから投げたUnexpected token n in JSON at position 0

しかし、これは、JSON.parse() で JS オブジェクトではないものを渡すたびに発生します。

于 2020-01-27T06:57:24.553 に答える
-24

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

eval(inputString);
于 2013-09-20T05:34:28.940 に答える