javascript - JSON.parse() 是否接受 Buffer 作为参数?

标签 javascript node.js json

以下代码适用于 Node.js v14.16.0。但是,我找不到任何文档表明 JSON.parse() 接受 Buffer 作为参数。这是预期的行为(尚未记录)还是我做错了什么?

const fs = require('fs');
const dataPayload = fs.readFileSync('data.json'); // a buffer
const data = JSON.parse(dataPayload);

console.log(data); // { name: 'Jane', age: 24 } -> an object

data.json 的内容:

{
  "name": "Jane",
  "age": 24
}

spec没有提到与此相关的任何内容。

最佳答案

它最终将 Buffer 转换为字符串,当您将对象传递给 JSON.parse(text [,reviver]) 时,ECMAScript 规范中对此进行了描述。

ECMAScript spec JSON.parse() 包含第一步:

Let JText be ToString(text).

因此,第一步是获取传递给 JSON.parse(text) 的第一个参数,如果尚未将其转换为字符串。如果您想了解 ToString(text) 的工作原理,请参见 here in the spec .在这种情况下,Buffer 将是一个对象,因此它将遵循调用内部 ToPrimitive() 的路径,并使用字符串提示作为类型,然后调用内部 ToString() 在上面。


下面是一个在片段中运行的小示例,显示它在对象上使用 .toString() 方法:

let data = {
    toString() {
         console.log(`".toString()" method called`);
         return "[1,2,3]";    // return some JSON
    }
};

let test = JSON.parse(data);

console.log(`Is this an array: ${Array.isArray(test)}`);
console.log(`Array of length: ${test.length}`);
console.log(test);

关于javascript - JSON.parse() 是否接受 Buffer 作为参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66994023/

相关文章:

android - 如何使用 Retrofit 发布复杂的 JSON 参数

ios - iOS中解析原始类型的编码标准

javascript - 尝试使用 html 控制台获取元素的样式属性时出错

javascript - "Functions are not valid as a React child"尝试从模块对象使用 HOC

javascript - jQuery AJAX 调用返回 [object Object]

javascript - 如何将 LinkedIn 时间戳解析为人类可读的

ios - 在 iOS 中使用 NSJSONSerialization 是否有数据限制?

node.js - 从 firebase 下载文件并上传到 stripe 进行身份验证

javascript - 对同一个幻像实例使用两次 createPage()

mysql - Google Cloud Functions 中 Api 设计的最佳方法?