在将excel转js对象保存为文件的过程中,遇到json中的函数处理问题,数据用JSON转换后发现函数会丢,所以就把函数整个作为字符串存储到对象内,然后导致另一个问题,对象中的函数字符串怎么转成对象保存到文件里
需要处理的json中的部分结构:
str = `
"a_c.b.d": {
"aaa": [
"T1",
"T2"
],
"O": "xxx",
"D": {
"a": "constant",
"x": "value"
},
"funcKey": {
"d": "variable",
"func": "function fx() { return {} }"
}
},
"a_c.b.x123": {
"aaa": [
"T1",
],
"O": "desc",
"D": {
"a": "constant",
"x": 1
},
"funcKey": {
"d": "variable",
"func": "function fx() { return {\"u\":\"\"} }"
}
},
`
期待的结果:
var res = `
'a_c.b.d': {
aaa: ['T1', 'T2'],
O: 'xxx',
D: {
a: 'constant',
x: 'value',
},
funcKey: {
func: function fx() {
return {};
},
},
},
'a_c.b.x123': {
aaa: ['T1'],
O: 'desc',
D: {
a: 'constant',
x: 1,
},
funcKey: {
func: function fx() {
return { u: '' };
},
},
},
`
需要处理的有以下几点:
1.以"func"为key的字段值为函数字符串,需要转换成有缩进的函数字符串(写入js文件后识别为函数而不是字符串)
2.去除json中key的双引号,key中含有特殊字符无法去除的改成单引号
3.value中的双引号改成单引号
重点是1需要处理,暂时没找到好的解决办法,2和3已有解法,这里提出来是为了寻找一种统一的实现
function writeFile(string) {
// TODO: 需要处理的位置
fs.appendFileSync(string, 'output.js')
}
function parse(jsonString, outputDir) {
const lines = JSON.stringify(jsonString, null, 2);
const lines = lines.split(/\r?\n/);
writeFile(`const Config = `);
for(let line of lines) {
writeFile(`${line}\n`);
}
writeFile('export default Config;\n')
}
JSON.parse
在结项function 正则 map等数据结构时会丢失。可以试试 deep clone 的方式,深复制的解决方案很多,比如lodash的 cloneDeep 方法。如果还是按照目前思路的话,尝试下 new Function(string) 解决,需要针对function() {} 和 () => {} 做下处理。