簡體   English   中英

JSON 中的意外令牌位於 position 0

[英]Unexpected token in JSON at position 0

我正在嘗試使用 fs 讀取 a.json 文件並使用 JSON.parse() function 解析為 JavaScript object。

const json = JSON.parse(fs.readFileSync('./db.json', (err) => { if (err) throw err; }))
{
  "hello": "world"
}

但我收到以下錯誤:

undefined:1 { ^ SyntaxError: position 0 處 JSON 中的意外標記

有誰知道怎么了?

如果您不告訴它使用什么編碼將文件內容轉換為文本, readFileSync將返回一個Buffer 如果將Buffer傳遞給JSON.parse ,它將在解析之前轉換為字符串。 BuffertoString默認為 UTF-8。

所以有幾個可能的問題:

  1. 該文件不在 UTF-8
  2. 是的,但它上面有一個字節順序標記(BOM) (這有點不尋常——UTF-8 有一個固定的字節順序——但有一個定義,有時文件將它作為它們在 UTF-8 中的指示符)

除此之外, readFileSync不接受回調(它返回結果或拋出錯誤,因為它是同步的——這就是Sync后綴在 Node.js API 中的含義)。 (如果它確實有回調,那么在該回調中執行throw err將毫無意義。例如,它不會從您調用readFileSync的 function 中拋出錯誤。)

如果文件不是 UTF-8,請告訴readFileSync使用什么編碼(我建議始終這樣做,而不是稍后依賴隱式轉換為字符串)。 如果它在(比如說)UTF-16LE(“UTF-16 little endian”)中,那么你會這樣做:

const data = JSON.parse(fs.readFileSync('./db.json', "utf16le"));

如果它在帶有 BOM 的 UTF-8 中: Buffer在轉換為字符串時不會刪除 BOM,因此您最終會在 position 0 處看到一個奇怪的字符,而JSON.parse不喜歡。 如果是這種情況,您可以這樣做:

const UTF8_BOM = "\u{FEFF}";
let json = fs.readFileSync('./db.json', "utf8");
if (json.startsWith(UTF8_BOM)) {
    // Remove the BOM
    json = json.substring(UTF8_BOM.length);
}
// Parse the JSON
const data = JSON.parse(json);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM