Estoy tratando de leer un archivo .json con fs y analizar un objeto JavaScript usando la función JSON.parse().
const json = JSON.parse(fs.readFileSync('./db.json', (err) => { if (err) throw err; }))
{ "hello": "world" }
Pero estoy recibiendo el siguiente error:
undefined:1 { ^ SyntaxError: Token inesperado en JSON en la posición 0
¿Alguien sabe lo que está mal?
readFileSync
devuelve un Buffer
si no le indica qué codificación usar para convertir el contenido del archivo en texto. Si pasa un Buffer
a JSON.parse
, se convertirá en una cadena antes de analizarse. El valor predeterminado de toString
de Buffer
es UTF-8.
Así que hay un par de posibles problemas:
Aparte de eso, readFileSync
no acepta una devolución de llamada (devuelve su resultado o arroja un error en su lugar, porque es sincrónico; eso es lo que significa el sufijo Sync
en la API de Node.js). (Si tuviera una devolución de llamada, throw err
en esa devolución de llamada no tendría sentido. Por ejemplo, no arrojaría un error de la función a la que está llamando a readFileSync
).
Si el archivo no es UTF-8, dígale a readFileSync
qué codificación usar (sugiero hacerlo siempre en lugar de depender de la conversión implícita a una cadena más adelante). Si está en (digamos) UTF-16LE ("UTF-16 little endian"), entonces haría esto:
const data = JSON.parse(fs.readFileSync('./db.json', "utf16le"));
Si está en UTF-8 con una lista de materiales: el Buffer
no elimina la lista de materiales cuando se convierte en cadena, por lo que termina con lo que parece un carácter extraño en la posición 0 que no le gusta a JSON.parse
. Si ese es el caso, puedes hacer esto:
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);