保存含Emoji的JSON至文件后解析报错:Unexpected token in JSON
解决含Emoji的JSON文件保存与解析问题
问题原因
你的代码存在两个关键问题:
- 使用
fileBuffer.asciiSlice()读取文件——Emoji属于Unicode字符(超出ASCII编码范围),用ASCII方式解析会破坏字符结构,导致JSON出现无效字符,触发Unexpected token错误。 fs.writeFileSync和fs.readFileSync是同步方法,不需要加await关键字,属于冗余写法。
修复方案
方案1:读取时直接指定UTF-8编码(推荐)
读取文件时指定utf8编码,直接获取正确的字符串后解析JSON:
const fs = require('fs'); const message = { message: 'Thanks again 👸💋' }; // 同步写入文件,无需await fs.writeFileSync('test123.json', JSON.stringify(message)); // 读取时指定utf8编码,直接得到可解析的字符串 const jsonStr = fs.readFileSync('test123.json', 'utf8'); const json = JSON.parse(jsonStr); console.log(json); // 输出:{ message: 'Thanks again 👸💋' }
方案2:手动将Buffer转为UTF-8字符串
如果需要处理Buffer对象,不要用asciiSlice(),改用toString('utf8')完成转换:
const fs = require('fs'); const message = { message: 'Thanks again 👸💋' }; fs.writeFileSync('test123.json', JSON.stringify(message)); const fileBuffer = fs.readFileSync('test123.json'); // 用UTF-8编码转换Buffer为字符串 const jsonStr = fileBuffer.toString('utf8'); const json = JSON.parse(jsonStr); console.log(json);
关键说明
JSON.stringify默认支持Unicode字符(包括Emoji),无需额外配置即可正确序列化;- 必须使用支持Unicode的编码(如UTF-8)读取包含Emoji的文件,ASCII编码无法处理非ASCII字符;
- Node.js的同步文件操作方法不需要
await,只有异步方法(fs.writeFile/fs.readFile)才需要配合async/await使用。
内容的提问来源于stack exchange,提问作者Dashiell Rose Bark-Huss
相关产品推荐
相关产品推荐

