如何用util.inspect生成带引号键的符合预期的JSON格式输出?
问题:Node.js写入JSON文件时键无引号导致读取报错
代码与预期输出
你的代码
var gameon = 1; var fighter1 = {"userid":"97","username":"john","items":{},"ailments":{}}; var fighter2 = {"userid":"91","username":"james","items":{},"ailments":{}}; var resume = 30; all = {gameon:gameon,fighter1:fighter1,fighter2:fighter2,resume:resume,inturn:fighter1,outturn:fighter2}; fs.writeFileSync(file, util.inspect(all, { showHidden: true, depth: null }), { encoding: 'utf8', flag: 'w' });
期望的JSON输出
{ "gameon":1, "fighter1":{ "userid":"97", "username":"john", "items": {}, "ailments":{} }, "fighter2":{ "userid":"91", "username":"james", "items":{}, "ailments":{} }, "resume":"", "inturn":{ "userid":"97", "username":"john", "items":{}, "ailments":{} }, "outturn":{ "userid":"91", "username":"james", "items":{}, "ailments":{} } }
原因分析
- 核心问题:你用了
util.inspect()来生成对象的字符串表示,这个方法是Node.js的调试工具,用来输出适合人类阅读的对象调试信息,而非标准JSON格式。它不会自动给键名加双引号(仅特殊标识符才加),导致写入的文件不符合JSON规范,后续用JSON.parse()读取必然报错。
解决方法
改用Node.js内置的JSON.stringify()方法序列化对象,它严格遵循JSON规范,自动给所有键名加双引号,还支持格式化输出。另外注意你期望中resume的值是空字符串,需要手动调整代码里的变量值。
修改后的代码
var gameon = 1; var fighter1 = {"userid":"97","username":"john","items":{},"ailments":{}}; var fighter2 = {"userid":"91","username":"james","items":{},"ailments":{}}; var resume = ""; // 调整为期望的空字符串 const all = { gameon: gameon, fighter1: fighter1, fighter2: fighter2, resume: resume, inturn: fighter1, outturn: fighter2 }; // JSON.stringify参数说明: // 1. 要序列化的对象 // 2. replacer:null表示保留所有属性 // 3. 缩进数:2表示用2个空格缩进,让输出更易读 fs.writeFileSync(file, JSON.stringify(all, null, 2), { encoding: 'utf8', flag: 'w' });
补充说明
- 如果遇到对象循环引用的场景(比如对象内部引用自身),基础
JSON.stringify()会报错,此时可以自定义replacer函数处理,或使用第三方库(如circular-json),但你的当前场景不需要额外处理。
内容的提问来源于stack exchange,提问作者Cain Nuke
相关产品推荐
相关产品推荐

