NodeJS下Base64编解码键值对文本后转JSON失败问题求解
问题根因
- 你的配置文件内容是逐行等号分隔的键值对格式,不符合JSON语法规范:合法JSON要求键名必须用双引号包裹、键和值用冒号分隔、整体结构包裹在大括号中,直接对原始键值对文本调用
JSON.parse()必然解析失败。 - 你使用的
JSON.parse(JSON.stringify(decoded))是无效操作:JSON.stringify对字符串类型入参会做转义包裹,再执行JSON.parse只会得到原始字符串本身,完全不会完成键值对到JSON结构的转换。 - 你的文本替换逻辑存在错误:
.replace(/\n/g, '').replace(/\s/g, " ")会先删除所有换行符,再把所有空白字符替换为单个空格,直接把多行配置拼成无分隔的长字符串,彻底丢失键值对的行边界,进一步导致无法解析。
修复方案
不需要额外依赖,直接对解码后的文本按行拆分、逐行提取键值对组装为标准JS对象,即可得到合法的可序列化JSON结构,修正后的代码如下:
const fs = require('fs'); fs.readFile('./setting.txt', 'utf8', function(err, data) { if (err) throw err; // Base64编解码(Node原生Buffer实现,和第三方base64包结果一致,不需要额外装依赖) const encodedData = Buffer.from(data).toString('base64'); const decoded = Buffer.from(encodedData, 'base64').toString('utf8'); const config = {}; // 按换行拆分每行,过滤空行、无效行 decoded.split(/\r?\n/) .filter(line => line.trim() && line.includes('=')) .forEach(line => { // 按第一个等号切割,兼容值中可能包含等号的场景 const splitPos = line.indexOf('='); const key = line.slice(0, splitPos).trim(); let value = line.slice(splitPos + 1).trim(); // 数字类型值自动转数值,不需要可以注释该段逻辑直接保留字符串 if (!isNaN(Number(value))) value = Number(value); config[key] = value; }); // config就是标准JS对象,可直接序列化为合法JSON,也可直接用于业务字段填充 // const legalJsonStr = JSON.stringify(config); return res.status(200).send(config); });
解析完成后得到的标准JSON结构如下:
{ "LENGTH": 1076, "CRC16": 28653, "OFFSET": 37, "MEASUREMENT_SAMPLING_RATE": 4, "MEASUREMENT_RANGE": 1, "MEASUREMENT_TRACE_LENGTH": 16384, "MEASUREMENT_PRETRIGGER_LENGTH": 0, "MEASUREMENT_UNIT": 2, "MEASUREMENT_OFFSET_REMOVER": 1 }
注意事项
- 不要提前对解码后的全量文本做换行删除、全局空白替换操作,会破坏键值对的分隔边界,如需处理空白只需要对拆分后的单个键、值做首尾trim即可。
- 如果你的配置项值存在布尔类型、空值等特殊格式,可以在遍历行的逻辑里加对应的类型转换规则即可。
内容的提问来源于stack exchange,提问作者Xandar
相关产品推荐
相关产品推荐

