Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将对象写入文件时的节点JS[对象映射]_Javascript_Json_Node.js - Fatal编程技术网

Javascript 将对象写入文件时的节点JS[对象映射]

Javascript 将对象写入文件时的节点JS[对象映射],javascript,json,node.js,Javascript,Json,Node.js,我在stackoverflow和其他教程网站上读了很多关于将object/JSON写入文件的文章,但没有一个解决方案适合我 1代码: let messages = await fetchMessages() console.log(messages) // Prints an object fs.writeFileSync('./msgdata.json', messages , 'utf-8'); 2也试过, fs.writeFileSync('./msgdata.json', JS

我在stackoverflow和其他教程网站上读了很多关于将object/JSON写入文件的文章,但没有一个解决方案适合我

1代码:

let messages = await fetchMessages()
console.log(messages)    // Prints an object
fs.writeFileSync('./msgdata.json', messages , 'utf-8'); 
2也试过,

fs.writeFileSync('./msgdata.json', JSON.stringify(messages) , 'utf-8'); 
3也试过,

fs.writeFileSync('./msgdata.json', JSON.stringify(messages) , 'utf-8'); 
fs.writeFile,但获得与上面相同的输出

msgdata.json:用于1

[object Map]
msgdata.json:用于2和3

{}
有人能指出这是什么原因吗

console.logmessages的输出
这是因为返回的对象是映射对象。当您使用JSON.strigif创建映射对象时,它总是返回{}。有两种方法可以获取存储地图的可读JSON。第一个是循环所有条目并创建一个JSON,其中考虑键和值。这应该很容易实现

另一种方法是从地图创建一个数组,然后将其字符串化

fs.writeFileSync('./msgdata.json', JSON.stringify([...myObject]) , 'utf-8'); 

这是因为返回的对象是映射对象。当您使用JSON.strigif创建映射对象时,它总是返回{}。有两种方法可以获取存储地图的可读JSON。第一个是循环所有条目并创建一个JSON,其中考虑键和值。这应该很容易实现

另一种方法是从地图创建一个数组,然后将其字符串化

fs.writeFileSync('./msgdata.json', JSON.stringify([...myObject]) , 'utf-8'); 
您可以定义Map.prototype.toJSON,但它不是标准的,不鼓励使用。如果找到它,JSON.stringify会自动调用它

Map.prototype.toJSON = function() {return [...this];};
console.log(JSON.stringify(messages));
如果需要从JSON重建映射,更好的方法是定义自己的替换函数和恢复函数。在这里,我还将表示数组的映射包装在一个特殊对象中,以JSON区分映射和普通数组:

function replacer (key, value) {
    if (value instanceof Map) {
        return {
            _type: "map",
            map: [...value],
        }
    } else return value;
}

function reviver (key, value) {
    if (value._type == "map") return new Map(value.map);
    else return value;
}

let str = JSON.stringify(messages, replacer);
let msg = JSON.parse(str, reviver);
关于循环结构的错误意味着其中的某些对象/数组包含对自身的引用。存储消息时,不需要存储与频道等相关的所有信息,而只存储ID。因此,这意味着为TextChannel、ClientUsers、GuildMembers等扩展替换程序:

您可以定义Map.prototype.toJSON,但它不是标准的,不鼓励使用。如果找到它,JSON.stringify会自动调用它

Map.prototype.toJSON = function() {return [...this];};
console.log(JSON.stringify(messages));
如果需要从JSON重建映射,更好的方法是定义自己的替换函数和恢复函数。在这里,我还将表示数组的映射包装在一个特殊对象中,以JSON区分映射和普通数组:

function replacer (key, value) {
    if (value instanceof Map) {
        return {
            _type: "map",
            map: [...value],
        }
    } else return value;
}

function reviver (key, value) {
    if (value._type == "map") return new Map(value.map);
    else return value;
}

let str = JSON.stringify(messages, replacer);
let msg = JSON.parse(str, reviver);
关于循环结构的错误意味着其中的某些对象/数组包含对自身的引用。存储消息时,不需要存储与频道等相关的所有信息,而只存储ID。因此,这意味着为TextChannel、ClientUsers、GuildMembers等扩展替换程序:

参考文献


参考

你确定console.logmessages不在控制台上记录{}吗?@vibhor1997a,是的,非常确定你确定console.logmessages不在控制台上记录{}吗?@vibhor1997a,是的,非常确定哇!这是我学到的很酷的东西。什么是…值语法?如果我使用第一种方法Map.prototype.toJSON,那么如何调用它呢?当toJSON方法出现在Map上时,JSON.stringify将调用toJSON方法。[…value]是扩展语法ES6+,将映射转换为数组[[key,value],[key-value],…]好的,谢谢理解…尝试解决方案时出现此错误``节点:4252未处理PromisejectionWarning:未处理的承诺拒绝id:1:TypeError:将循环结构转换为JSON节点:4252[DEP0018]弃用警告:未处理的承诺拒绝已弃用。将来,未处理的承诺拒绝将使用非零退出代码终止Node.js进程。`尝试了您的解决方案,但我收到了此错误……`但是通道之前的每个消息类型是什么:?您需要一个替换程序,用于我在编辑中输入的外部类,或者用于消息本身,以用它们的ID替换外部类。我不确定我是否理解它,您是否可以编辑您的答案?我实际应该如何做哇!这是我学到的很酷的东西。什么是…值语法?如果我使用第一种方法Map.prototype.toJSON,那么如何调用它呢?当toJSON方法出现在Map上时,JSON.stringify将调用toJSON方法。[…value]是扩展语法ES6+,将映射转换为数组[[key,value],[key-value],…]好的,谢谢理解…尝试解决方案时出现此错误``节点:4252未处理PromisejectionWarning:未处理的承诺拒绝id:1:TypeError:将循环结构转换为JSON节点:4252[DEP0018]弃用警告:未处理的承诺拒绝已弃用。将来,未处理的承诺拒绝将使用非零退出代码终止Node.js进程。`尝试了您的解决方案,但我收到了此错误……`但是通道之前的每个消息类型是什么:?您需要一个替换程序来替换我在编辑中输入的外部类或消息本身,以便用它们的ID替换外部类。我不确定我是否
erstood it,您是否可以编辑您的答案?我应该如何实际编辑感谢您的回答,我将尝试并更新herenode:4252 UnhandledPromisejectionWarning:Unhandled promise rejection id:1:TypeError:Converting circular structure to JSON node:4252[DEP0018]DeprecationWarning:Unhandled promise rejections不推荐使用。将来,未处理的承诺拒绝将使用非零退出代码终止Node.js进程。尝试了你的解决方案,我发现了这个错误…@爱好者你能告诉我控制台打印的是什么吗@Shiven@eNthUsiAst哇。[object Map]似乎很奇怪,因为输出似乎是JSON。但实际上,您能告诉我什么是console.logJSON.stringifymessages而不是直接的日志打印吗?我相信它会是空的,是吗?谢谢你的回答,我将尝试并在此处更新node:4252 UnhandledPromisejectionWarning:Unhandled Promisejection拒绝id:1:TypeError:Converting circular structure to JSON node:4252[DEP0018]Deprecation警告:未经处理的承诺拒绝已被拒绝。将来,未处理的承诺拒绝将使用非零退出代码终止Node.js进程。尝试了你的解决方案,我发现了这个错误…@爱好者你能告诉我控制台打印的是什么吗@Shiven@eNthUsiAst哇。[object Map]似乎很奇怪,因为输出似乎是JSON。但实际上,您能告诉我什么是console.logJSON.stringifymessages而不是直接的日志打印吗?我相信它会是空的,是吗?