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
エラーを表示するためにコンソールを開く
products
はオブジェクトです。 (オブジェクトリテラルから作成)
JSON.parse()
は、 string を含むJSON表記をJavascriptオブジェクトに変換するために使用されます。
JSONテキストとして解析しようとするために、コードは(.toString()
を呼び出すことによって)オブジェクトを文字列に変換します。
デフォルトの.toString()
は"[object Object]"
を返しますが、これは有効なJSONではありません。それゆえエラーです。
それが有効な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);
stringify オブジェクトが欲しいようです。そうこれをしなさい:
JSON.stringify(products);
エラーの原因は、JSON.parse()
がString
値を期待し、products
がArray
であることです。
注:[
の後にトークンo
を期待していないと文句を言うjson.parse('[object Array]')
を試みると思います。
私はJSON.parse(inputString)
についても同じ問題を発見しました。
私の場合、入力文字列は私のサーバーのページから来ています [ページメソッドの返却] 。
私はtypeof(inputString)
を印刷しました - それは文字列でした、それでもエラーは起こります。
私はJSON.stringify(inputString)
も試しましたが、役に立ちませんでした。
後で、これがフィールド値の中の改行演算子[\n]
の問題であることがわかりました。
を[他の文字に置き換えて、解析後に新しい行を元に戻します] を置き換えました - /すべてがうまく機能しています。
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"}]';
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
[
{
"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です。
これは私が以前の回答に基づいて作った機能です:それは私のマシンではなく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;
}
JSON.parse()
を呼び出すときに"SyntaxError: Unexpected token"
例外が発生する可能性があるもう1つの問題は、文字列値に次のいずれかを使用していることです。
改行文字.
タブ(はい、Tabキーで作成できるタブです)
スタンドアローンのスラッシュ\
(ただし何らかの理由で/
ではない、少なくとも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のみのフォーマットでは、それは全く読めなくなる。
POSTまたはPUTメソッドを使用している場合は、必ず体の部分を文字列化してください。
私はここで例を文書化しました https://Gist.github.com/manju16832003/4a92a2be693a8fda7ca84b58b8fa7154
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
あなたがしている唯一の間違いは、あなたがすでにパースされたオブジェクトをパースしているのでエラーを投げているので、これを使うとうまくいくでしょう。
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()を使用してください。
前後にスペースがある場合は無効になります。末尾/先頭のスペースは次のように削除できます。
mystring = mystring.replace(/^\s+|\s+$/g, "");
出典: http://www.toptip.ca/2010/02/javascript-trim-leading-or-trailing.html
うまくいけば、これは他の誰かに役立ちます。
私の問題は、コメントを解析して無効なJSONを返すPHPを介してAJAXコールバック関数でHTMLにコメントを付けたことです。
コメントされたHTMLを削除すると、すべて問題なくJSONが問題なく解析されました。
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]);
これは多くの理由で起こる可能性がありますが、おそらく無効なcharなので、オブジェクトをJSONに変換するJSON.stringify(obj);
を使用できますが、それはJQUERY式であることを覚えておいてください。
なぜあなたはJSON.parseが必要ですか?すでにオブジェクトフォーマットの配列になっています。
以下のようにJSON.stringifyを使用してください。var b = JSON.stringify(products);
これはあなたを助けるかもしれません。
今、どうやら\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;
}
}
}
Jsonオブジェクトを返したAPIがAN ERROR(私の場合はCode Igniter、phpコードが失敗したときはhtmlを返す)を与えていたため、このエラーが発生します。
SQL文とPHPコードを確認し、Postman(または他の何らかのAPIテスター)でテストしてください。
あなたが得ているエラー、すなわち "予想外のトークンo"はjsonが期待されているが解析中にオブジェクトが取得されるためです。その "o"はWordの "object"の最初の文字です。
ああ、これまでに提供されたすべての答えの解決策は私のために働かなかった。私は今同様の問題を抱えていました。私はなんとか引用符で包みながら解決しました。スクリーンショットを見てください。うーん。
オリジナル:
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