2017-05-25 14 views
1

私はNode.jsで最初のアプリケーションを書いています私は、データがJSON形式で格納されているファイルからいくつかのデータを読み込もうとしています。JSON.parse()によってエラーが発生します: `SyntaxError:JSONの位置0の予期しないトークン`

私はこのエラーを取得する:ここで

SyntaxError: Unexpected token  in JSON at position 0

at Object.parse (native)

は、このコードの一部です:ここでは

//read saved addresses of all users from a JSON file 
fs.readFile('addresses.json', function (err, data) { 
    if (data) { 
     console.log("Read JSON file: " + data); 
     storage = JSON.parse(data); 

console.log出力され(と私は.jsonファイル自体をチェックし、それは同じです) :

Read JSON file: { 

    "addresses": [] 

} 

これは正しいJSONのようです。なぜJSON.parse()が失敗するのですか?

+1

'JSON.parse'引数で改行が有効になっていません – MysterX

+0

@MysterXしかし、構文エラーは位置0にありますか? JSON.parse()では、改行を有効にする引数がないようです。 – K48

+0

BOMのためにエンコーディングを設定する必要があります –

答えて

6

ファイルの先頭に奇妙な文字があります。

data.charCodeAt(0) === 65279

私が推薦する:

fs.readFile('addresses.json', function (err, data) { 
if (data) { 
    console.log("Read JSON file: " + data); 
    data = data.trim(); 
    //or data = JSON.parse(JSON.stringify(data.trim())); 
    storage = JSON.parse(data); 
}}); 
+0

あなたは正しいです。どうやらそれはバイトオーダーマークです。 – K48

+0

私は同様の問題を抱え、 'JSON.parse()'を実行する前に 'data.trim()'を追加していました。 – Valjas

0

JSON.parse()では、末尾にカンマを使用できません。だから、あなたはそれを取り除く必要があります。

JSON.parse(JSON.stringify(data)); 

あなたは、hereをそれについての詳細を見つけることができます。

+0

奇妙なことに、ファイルにカンマが1つもありませんか? – K48

+0

これは、 "addresses":[] – Luillyfe

+0

を意味しますが、構文エラーは位置0にありますか? – K48

2

がファイルを読み込む前に設定するための符号化を必要とBOMのこの

fs.readFile('addresses.json','utf-8', function (err, data) { 
    if (data) { 
     console.log("Read JSON file: " + data); 
     storage = JSON.parse(data); 

そのようにそれを試してみてください。そのそれはBOM [1]かもしれない

https://github.com/nodejs/node-v0.x-archive/issues/186

2

githubのにnodejsレポジトリに発行されて。 コンテンツのファイルをUTF-8 + BOMで保存してテストしましたが、同じエラーが発生しました。

> JSON.parse(fs.readFileSync("a.json")) 
SyntaxError: Unexpected token in JSON at position 0 

そして、ここでの提案に基づいて、[2]、あなたはそれを交換するか、またはあなたがJSON.parse()を呼び出す前に、それをドロップすることができます。例えば

var storage = {}; 

    fs.readFile('a.json', 'utf8', function (err, data) { 
     if (data) { 
      console.log("Read JSON file: " + data); 
      console.log(typeof(data)) 
      storage = JSON.parse(data.trim()); 
     } 
}) 

又は

var storage = {}; 
fs.readFile('a.json', function (err, data) { 
    if (data) { 
     console.log("Read JSON file: " + data); 
     console.log(typeof(data)) 
     storage = JSON.parse(data.toString().trim()); 
    } 
}) 

あなたはまたBuffer.slice()を使用して、(UTF-8の場合)最初の3つのバイトを除去することができます。

関連する問題