web-dev-qa-db-ja.com

不明なSyntaxError:JSON.parseの予期しないトークン

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

エラーを表示するためにコンソールを開く

148
coiso

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

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

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

189
SLaks

それが有効な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);
95
EdH

stringify オブジェクトが欲しいようです。そうこれをしなさい:

JSON.stringify(products);

エラーの原因は、JSON.parse()String値を期待し、productsArrayであることです。

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

54

私はJSON.parse(inputString)についても同じ問題を発見しました。

私の場合、入力文字列は私のサーバーのページから来ています [ページメソッドの返却]

私はtypeof(inputString)を印刷しました - それは文字列でした、それでもエラーは起こります。

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

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

を[他の文字に置き換えて、解析後に新しい行を元に戻します] を置き換えました - /すべてがうまく機能しています。

27
Derin
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"}]';
10
pktangyue

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
8
Térence
[
  {
    "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
San

これは私が以前の回答に基づいて作った機能です:それは私のマシンではなく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
              //https://stackoverflow.com/questions/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
tmurphree

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

  1. 改行文字.

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

  3. スタンドアローンのスラッシュ\(ただし何らかの理由で/ではない、少なくともChromeではそうではない)

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

たとえば、次のようにするとこの例外が発生します。

{
    "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のみのフォーマットでは、それは全く読めなくなる。

2
c00000fd

POSTまたはPUTメソッドを使用している場合は、必ず体の部分を文字列化してください。

私はここで例を文書化しました https://Gist.github.com/manju16832003/4a92a2be693a8fda7ca84b58b8fa7154

2
Manjunath Reddy

https://jsonformatter.curiousconcept.com/ で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
2
hoogw

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

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

1
Kiran Maniya

前後にスペースがある場合は無効になります。末尾/先頭のスペースは次のように削除できます。

mystring = mystring.replace(/^\s+|\s+$/g, "");

出典: http://www.toptip.ca/2010/02/javascript-trim-leading-or-trailing.html

1
att

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

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

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

1
Chris

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
ic3b3rg

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

0

なぜあなたはJSON.parseが必要ですか?すでにオブジェクトフォーマットの配列になっています。

以下のようにJSON.stringifyを使用してください。var b = JSON.stringify(products);

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

0
abhijit padhy

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

ブラウザによってはJSON.parseの入力に additional の必要条件があるかもしれないことに注意してください。

ブラウザでこのテストコードを実行してください。

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でテストしたところ、xが34、92、または0から31のJSON.parse(String.fromCharCode(0x22, x, 0x22));は許可されていません。

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
Pacerier

Jsonオブジェクトを返したAPIがAN ERROR(私の場合はCode Igniter、phpコードが失敗したときはhtmlを返す)を与えていたため、このエラーが発生します。

SQL文とPHPコードを確認し、Postman(または他の何らかのAPIテスター)でテストしてください。

0
Ari Waisberg

あなたが得ているエラー、すなわち "予想外のトークンo"はjsonが期待されているが解析中にオブジェクトが取得されるためです。その "o"はWordの "object"の最初の文字です。

0
Shashank Bodkhe

ああ、これまでに提供されたすべての答えの解決策は私のために働かなかった。私は今同様の問題を抱えていました。私はなんとか引用符で包みながら解決しました。スクリーンショットを見てください。うーん。

enter image description here

オリジナル:

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
Well Smith