Javascript 将纯文本文件转换为JSON

Javascript 将纯文本文件转换为JSON,javascript,json,string,Javascript,Json,String,因此,我用下面的代码遇到了精神崩溃,我试图解析一个包含以下内容的纯文本文件: name = rattlesnake alias = snake,rattle health = 50 flee = 45 attacks bite = [3, 8, 30] punch = [5, 12, 90] name = bear alias = bear health = 100 flee = 15 attacks claw = [10, 15, 60] 到目前为止,我已经编写了以

因此,我用下面的代码遇到了精神崩溃,我试图解析一个包含以下内容的纯文本文件:

name = rattlesnake
alias = snake,rattle
health = 50
flee = 45
attacks
    bite = [3, 8, 30]
    punch = [5, 12, 90]

name = bear
alias = bear
health = 100
flee = 15
attacks
    claw = [10, 15, 60]
到目前为止,我已经编写了以下代码,但我讨厌它,它没有做到它应该做的。我已经试了好几个小时了。下面是函数:

var parseModFile = function(contents) {
    var hasTab = /(?<=\t).*$/;
    var split = contents.split("\r\n");
    var pushIt = "{";
    var numExtraBraces = 0;
    var closeBrace = 0;
    for (var l = 0; l < split.length; l++) {
        var doIt = "";
        if (split[l]) {
            if (split[l].length > 1) {
                if (hasTab.test(split)) {
                    doIt = split[l].replace(/\t/g, "");
                    if (doIt.indexOf(" = ") > -1) {
                        doIt = doIt.split(" = ");
                        var key = doIt[0];
                        var val = doIt[1];
                        if (key.length > 0 && val.length > 0) {
                            if (closeBrace == 2) {
                                doIt = "},\"" + key + "\": \"" + val + "\",";
                                closeBrace = 0;
                            } else {
                                doIt = "\"" + key + "\": \"" + val + "\",";
                            }
                            if (closeBrace == 1) {
                                closeBrace++;
                            }
                        }
                    } else {
                        doIt = doIt.split(" = ");
                        var key = doIt[0];
                        doIt = "\"" + key + "\": {";
                        numExtraBraces++;
                        closeBrace = 1;
                    }
                }
            }
            pushIt += doIt;
        }
    }
    for (var b = 0; b < numExtraBraces; b++) {
        pushIt += "}";
    }
    pushIt += "}";
    return pushIt
}
这显然不太正确,我希望是:

{
    "n": "rattlesnake",
    "a": "snake,rattle",
    "h": "50",
    "flee": "45",
    "attacks": {
        "bite": "[3, 8, 30]",
    }
},
{
    "n": "bear",
    "a": "bear",
    "h": "100",
    "flee": "15",
    "attacks": {
        "claw": "[10, 15, 60]",
    }
}


但我一点也不能让它合身。我在这里遗漏了什么?

也许这不是最优雅的解决方案,但出于您的需要,它提供了一个有效的JSON输出

您需要稍微调整一下,因为我使用了带换行符的纯文本输入

希望有帮助:)

PS:它需要[]括号,否则它不是有效的JSON

const fs = require('fs');
fs.readFile('data.txt', 'utf8', function read(err, data) {
    if (err) {
        throw err;
    }

    console.log(JSON.stringify(data));
    let chunk = data.split("\r\n");
    let end = [];
    for(let chun of chunk) {
        if(chun === "") {end.push("}},{"); continue;}
        let it = chun.replace(/\t/g, "").replace("    ", "").replace(/\n/g, "").split(" = ");
        switch (it.length) {
            case 1:
                end.push(`"${it[0]}":{`);
                break;
            case 2:
                end.push(`"${it[0]}":"${it[1]}",`);
                break;
        }
    }
    console.log("[{"+end.join("")+"}}]");
});
输出:

[{"name":"rattlesnake","alias":"snake,rattle","health":"50","flee":"45","attacks":{"bite":"[3, 8, 30]","dookie":"[1, 2, 5]",}},{"name":"bear","alias":"bear","health":"100","flee":"15","attacks":{"claw":"[10, 15, 60]","rawr":"[1, 4, 7]",}}]

这里是更紧凑,更容易阅读,超级自定义正则表达式

const content = ` your string `;

let result = ("{\n" + content +"\n  }\n}")
.replace(/=\s(\w.+)/g,': "$1"')
.replace(/=/g,':')
.replace(/\]/g,'],')
.replace(/,\n\n/g,'\n  }\n},\n{\n')
.replace(/(\w+)\n\s{4}/g,'$1 : { \n    ')
.replace(/\"\n/g,'",\n')
.replace(/(\w+)\s:/g,'"$1" :')
.replace(/\],\n\s+\}/g,']\n  }');

//making it a valid json by making it an array 
result = "[\n" + result + "\n]" ;
下面是显示输出的代码片段

const content=`name=响尾蛇
别名=蛇、响尾蛇
健康=50
逃跑=45
攻击
咬=[3,8,30]
打孔=[5,12,90]
名字=熊
别名=熊
健康=100
逃离=15
攻击
爪=[10,15,60]`;
让结果=(“{\n”+内容+“\n}\n}”)
.replace(/=\s(\w.+)/g',:“$1”)
.替换(/=/g,,:'))
.替换(/\]/g,'],')
.replace(/,\n\n/g,'\n}\n},\n{\n')
.replace(/(\w+)\n\s{4}/g,$1:{\n')
.替换(/\“\n/g,”,\n'))
.替换(/(\w+)\s:/g,“$1”:”
.replace(/\],\n\s+\}/g,']\n}');
//通过将其设置为数组使其成为有效的json
结果=“[\n”+结果+“\n]”;

console.log(JSON.parse(result))
@Mhmdrz_A-我不明白这个问题?我不算属性。代码逐行迭代,找到标签,找到
=
,然后解析;我从头开始写正则表达式;你的不可读我的正则表达式是
/(?事实上是这样。对不起,我把事情弄混了,一次只显示一行结果。更正了,它应该是JSON.parse-d,应该可以使用。哦,对不起,现在我明白了。事实上我不知道你需要多个攻击。我会看看我是否可以解决这个问题。现在怎么办?不幸的是,如果你更改模板,它将再次被破坏。不是确定它在未来会有多大的变化在我尝试复制换行符的方式和它在文件中的实际情况之间似乎有点问题。现在它为我返回了一个有效的输出
const content = ` your string `;

let result = ("{\n" + content +"\n  }\n}")
.replace(/=\s(\w.+)/g,': "$1"')
.replace(/=/g,':')
.replace(/\]/g,'],')
.replace(/,\n\n/g,'\n  }\n},\n{\n')
.replace(/(\w+)\n\s{4}/g,'$1 : { \n    ')
.replace(/\"\n/g,'",\n')
.replace(/(\w+)\s:/g,'"$1" :')
.replace(/\],\n\s+\}/g,']\n  }');

//making it a valid json by making it an array 
result = "[\n" + result + "\n]" ;