node.js - 节点缓冲区到 JSON
问题描述
当我读取 JSON 文件、解析并输出它时,我只得到一些随机数而不是我的 JSON 文件:
{
type: 'Buffer',
data: [
123, 0, 34, 0, 83, 0, 99, 0, 104, 0, 101, 0,
109, 0, 97, 0, 86, 0, 101, 0, 114, 0, 115, 0,
105, 0, 111, 0, 110, 0, 34, 0, 58, 0, 49, 0,
55, 0, 48, 0, 54, 0, 44, 0, 34, 0, 67, 0,
104, 0, 105, 0, 108, 0, 100, 0, 65, 0, 99, 0,
99, 0, 111, 0, 117, 0, 110, 0, 116, 0, 115, 0,
34, 0, 58, 0, 123, 0, 34, 0, 83, 0, 45, 0,
49, 0, 45, 0, 53, 0, 45, 0, 50, 0, 49, 0,
45, 0, 50, 0,
... 52404 more items
]
}
我使用以下代码加载并输出它:
contents = fs.readFileSync(filename);
console.log(JSON.parse(JSON.stringify(contents)))
我已经搜索过了,但没有找到可行的解决方案。
解决方案
这不是随机数,它是一个Buffer
. 如果您想将该缓冲区转换为字符串(以便您可以将 JSON 解析为对象等),您必须故意这样做,因为除非您知道文本使用什么编码(UTF8、Windows1252、 ETC。)。readFileSync
您可以提供一个encoding
选项来告诉它使用给定的编码将数据转换为字符串,或者您可以toString
在Buffer
.
或者,如果您使用CJS 模块(Node 的原始类型),它们可以让您通过 直接读取 JSON require
,并自动解析。
在评论中你说:
好的,我在上面使用了 toString() ,然后出现另一个错误: SyntaxError: Unexpected token { in JSON at position 1. 添加编码什么都不做。该文件是 UTF-8。
这是一个单独的问题,但是:
由于JSON.parse
从位置 0 开始计数(至少在 Node.js 中,我认为这不是规范所规定的),这告诉我们 JSON 无效,或者文件开头的字节顺序标记未被处理编码。
有时,编辑器会将 BOM 放在 UTF-8 文件的开头。您可以检查一下是否是这样的:
let text = yourBuffer.toString("utf8");
if (text.codePointAt(0) === 0xFEFF) { // UTF8 BOM
text = text.substring(1);
}
然后你应该可以使用JSON.parse
on text
。
推荐阅读
- c++ - 如何将 Boost DLL 放入 CMake 安装目录?
- excel-formula - 如何在GETPIVOTDATA中引用包含monthnameshort的单元格范围
- ssh - VS Code:通过 SSH 从 Windows 自动上传(部署)文件
- elasticsearch - 如何根据分片数计算 Elasticsearch 的分片数?
- python - python中基于response.status_code的循环函数
- html - 用 css 和 html 将图表放在半页中
- laravel - 无法解决依赖性 [参数 #0
- javascript - 错误类型错误:fs_1.statSync 不是函数
- keras - Google Colab 中的空闲 GPU 内存
- php - 当用户关闭浏览器/选项卡时自动更改数据库中的状态