【问题标题】:Does JSON.parse() accepts a Buffer as argument?JSON.parse() 是否接受 Buffer 作为参数?
【发布时间】:2021-04-08 08:22:04
【问题描述】:

以下代码适用于 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 没有提及任何与此相关的内容。

【问题讨论】:

  • Afaik,如果传递的对象不是字符串,JSON.parse() 首先调用.toString()。例如,一个常见的初学者错误是将对象传递给 JSON.parse(),这将导致 JSON.parse 抱怨意外字符 o,因为它试图解析 "[object Object]"

标签: javascript node.js json


【解决方案1】:

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

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

Let JText be ToString(text).

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


这是一个在 sn-p 中运行的小示例,表明它在对象上使用 .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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    • 1970-01-01
    • 2019-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多