如何将字符串提取为原始值?

const buf = Buffer.from('Calling Mr. Jones', 'utf8');
const ob = {b: buf};

console.log(ob.b.toString());
    // outputs "Calling Mr. Jones"

const obS = JSON.stringify(ob);

const obExtracted = JSON.parse(obS);

console.log(obExtracted.b.toString());
    // outputs "[object Object]" instead of "Calling Mr. Jones"

console.log(obExtracted.b);
    /* outputs:

        {
          type: 'Buffer',
          data: [
             67,  97, 108, 108, 105, 110,
            103,  32,  77, 114,  46,  32,
             74, 111, 110, 101, 115
          ]
        }
    */

推荐答案

您可以使用JSON.parse reviver函数

Note: this code may be more complex than needed, but, I tried to make it flexible enough to handle types of data, not just 100

const reviver = (key, value) => {
    const defaultReviver = (data, type) => new globalThis[type](data);
    const revivers = {
        // new Buffer is deprecated, so use Buffer.from
        Buffer: data => Buffer.from(data), 
        //
        // add any other exceptions (I can't think of any)        
    };

    if (typeof value !== "object") {
        return value;
    }
    const keys = Object.keys(value);
    if (keys.length !== 2 || !keys.includes("type") || !keys.includes("data")) {
        return value;
    }
    // only concern ourselves with global classes with `.toJSON`
    // to be honest, perhaps Buffer is the only one
    // but, this code should be flexible
    if (typeof globalThis[value.type]?.prototype?.toJSON !== 'function') {
        return value;
    }
    try {
        const fn = revivers[value.type] || defaultReviver;
        return fn(value.data, value.type);
    } catch {
        return value;
    }
};

只需一次更改即可完成部分代码

const buf = Buffer.from("Calling Mr. Jones", "utf8");
const ob = { b: buf };
const obS = JSON.stringify(ob);

const obExtracted = JSON.parse(obS, reviver); // use reviver

console.log(obExtracted.b.toString());

Javascript相关问答推荐

可以将SuperTest导入为ES 6模块吗?

为什么这个自定义组件会被放置在TR之外?

自定义帖子类型帖子未显示在网站上

我应该在redux reducer中调用其他reducer函数吗?

没有输出到带有chrome.Devtools扩展的控制台

fs. writeFile()vs fs.writeFile()vs fs.appendFile()

如何在RTK上设置轮询,每24小时

如何解决chrome—extension代码中的错误,它会实时覆盖google—meet的面部图像?'

微软Edge编辑和重新发送未显示""

React 17与React 18中的不同setState行为

如何在Javascript中的控制台上以一行形式打印循环的结果

Chart.js 4.4.2,当悬停在一个数据点上时,如何在工具提示中拥有多个数据点/标签?

如何调用名称在字符串中的实例方法?

如何将未排序的元素追加到数组的末尾?

使用VUE和SCSS的数字滚动动画(&;内容生成)

<;img>;标记无法呈现图像

更新Redux存储中的对象数组

如何使用<;Link>;执行与JS Reaction中的";window.Location=/GameOverDied;";类似的操作?

如何使本地html页面在重新加载时保持当前可隐藏部分的打开状态?

将相关数据组合到两个不同的数组中