为了进一步解释@Luillyfe的答案:
啊哈!fs.readFileSync("data.json")返回一个Javascript对象!
编辑:以下是不正确的...但总结了最初的想法!
我认为那是一个字符串。所以如果文件保存为UTF-8 / ascii,可能不会有问题?从readFileSync返回的javascript对象将转换为JSON.parse可以解析的字符串?不需要调用JSON.stringify吗?
我正在使用powershell保存文件。它似乎将文件保存为UTF-16(现在太忙了,无法检查)。因此,我得到了"SyntaxError:Unexpected token � in JSON at position 0."。
然而,JSON.stringify(fs.readFileSync("data.json"))正确地将返回的文件对象解析为JSON可以解析的字符串。
对我来说的线索是我的json文件内容看起来像下面这样(在将其记录到控制台后):
�{ " R o o m I D _ L o o k u p " : [
{
" I D " : 1 0 ,
" L o c a t i o n " : " f r o n t " ,
" H o u s e " : " f r o n t r o o m "
}
}
这似乎不是文件加载到字符串中的内容...
错误示例(不会崩溃...但会将JSON文件转换为无意义的字符!):
const jsonFileContents = JSON.parse(JSON.stringify(fs.readFileSync("data.json")))
我似乎在任何地方都找不到这个。但是很有道理!
编辑:嗯……那个对象只是一个缓冲区。对以上内容表示歉意!
解决方案:
const fs = require("fs");
function GetFileEncodingHeader(filePath) {
const readStream = fs.openSync(filePath, 'r');
const bufferSize = 2;
const buffer = new Buffer(bufferSize);
let readBytes = 0;
if (readBytes = fs.readSync(readStream, buffer, 0, bufferSize, 0)) {
return buffer.slice(0, readBytes).toString("hex");
}
return "";
}
function ReadFileSyncUtf8(filePath) {
const fileEncoding = GetFileEncodingHeader(filePath);
let content = null;
if (fileEncoding === "fffe" || fileEncoding === "utf16le") {
content = fs.readFileSync(filePath, "ucs2");
} else if (fileEncoding === "feff" || fileEncoding === "utf16be") {
content = fs.readFileSync(filePath, "uts2").swap16();
} else {
content = fs.readFileSync(filePath, "utf8");
}
return content.toString("utf8").trimStart();
}
function GetJson(filePath) {
const jsonContents = ReadFileSyncUtf8(filePath);
console.log(GetFileEncodingHeader(filePath));
return JSON.parse(jsonContents);
}
使用方法:
GetJson("data.json");
注意:目前我不需要这个程序是异步的。如果您可以将其改为异步,请添加另一个答案!
JSON.parse
参数中不支持换行 - MysterX