首页 > 解决方案 > 节点缓冲区到 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)))

我已经搜索过了,但没有找到可行的解决方案。

标签: node.jsjsonstringfilebuffer

解决方案


这不是随机数,它是一个Buffer. 如果您想将该缓冲区转换为字符串(以便您可以将 JSON 解析为对象等),您必须故意这样做,因为除非您知道文本使用什么编码(UTF8、Windows1252、 ETC。)。readFileSync您可以提供一个encoding选项来告诉它使用给定的编码将数据转换为字符串,或者您可以toStringBuffer.

或者,如果您使用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.parseon text


推荐阅读