Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用正则表达式格式化为JSON_Javascript_Json_Regex - Fatal编程技术网

Javascript 使用正则表达式格式化为JSON

Javascript 使用正则表达式格式化为JSON,javascript,json,regex,Javascript,Json,Regex,我读过一个JSON外观的文件,其格式类似于以下内容: { varParent1: { var1: true, var2: "this is a string", var3: 0, var4: "another string" }, varParent2:{ var1: false, var2: 0, var3: 92, var4: "string

我读过一个JSON外观的文件,其格式类似于以下内容:

{
    varParent1: {
        var1: true,
        var2: "this is a string",
        var3: 0,
        var4: "another string"
    },
    varParent2:{
        var1: false,
        var2: 0,
        var3: 92,
        var4: "string here",
        var5: "string2 here"
    }
}
我在一个变量中有这段代码,但是我不能编辑文件,所以我应该只处理变量

正如大家所看到的,它不是一种有效的JSON格式,所以我无法解析它。我需要将其格式化为如下内容:

{
    "varParent1": {
        "var1": true,
        "var2": "this is a string",
        "var3": 0,
        "var4": "another string"
    },
    "varParent2":{
        "var1": false,
        "var2": 0,
        "var3": 92,
        "var4": "string here",
        "var5": "string2 here"
    }
}
我已经考虑了逻辑,我有一个结论(我认为这很好):我必须在每一行的开头和结尾以及中间加上“'”:“也是。但是我不能用正则表达式这样做

有没有更简单的方法

    JSON.stringify({
            varParent1: {
                    var1: true,
                    var2: "this is a string",
                    var3: 0,
                    var4: "another string"
            },
            varParent2:{
                    var1: false,
                    var2: 0,
                    var3: 92,
                    var4: "string here",
                    var5: "string2 here"
            }
    })

输出将是json字符串。使用
json.parse
函数,您可以从json字符串创建javascript对象

可能不是最好的解决方法,但您可以创建
脚本
元素并将其分配给其中的变量以供使用

var data='{varParent1:{var1:true,var2:“这是一个字符串”,var3:0,var4:“另一个字符串”},varParent2:{var1:false,var2:0,var3:92,var4:“字符串在这里”,var5:“字符串2在这里”}
var script=document.createElement(“脚本”);
script.innerText=“var test=“+数据;
document.body.append(脚本);
log(test.varParent1.var2);
console.log(测试);
此:

var json = text.replace(/([A-Za-z0-9]+)\:/g, "\"$1\":");
适用于您的示例,但是如果字符串值包含冒号,则会遇到麻烦

对于更一般的解决方案,您可以先将字符串文字与其余文字分开,然后对非字符串应用替换,然后再次连接:

        var nonStrings = [], strings = [];
        var re = /"(?:[^"\\]|\\.)*"/g;
        var rs;
        var start = 0;
        while (rs = re.exec(text)) {
            var end = rs.index;
            nonStrings.push(text.substring(start,end));
            strings.push(rs[0]);
            start = end + rs[0].length;
        }
        nonStrings.push(text.substring(start));
        console.log(nonStrings);
        console.log(strings);
        for (var i = 0; i < nonStrings.length; ++i) {
            nonStrings[i] = nonStrings[i].replace(/([A-Za-z0-9]+)\:/g, "\"$1\":");
        }
        var json = nonStrings[0];
        for (var i = 0; i < strings.length; ++i) {
            json += strings[i] + nonStrings[i+1];
        }
        console.log(json);

不是有效的json,因此您不能使用json.parse。@VíctorLópez json.stringify的结果是有效的json,问题是如何使用JavaScript读取文件,然后解析其中的数据。您的建议似乎是“手动编辑文件,将其转换为JavaScript程序,然后执行该程序。”“这似乎与此没有多大关系。@乔治-如何将文件中的数据解析为JavaScript变量,以便使用JSON.stringify?@Quentin我的错,我没有正确阅读问题。将文件本身中的数据更改为JSON,而不是在代码中处理它,这难道不是更容易吗?由于我能看到的解析数据的唯一方法是使用
eval()
@George首先,感谢您的回答。我无法编辑该文件,因为它位于服务器上,我只有读取权限。这就是我试图用正则表达式解决它的主要原因。@H77-当文件在变量中时,它将是字符串,而不是对象。JSON.stringify只会创建该字符串的JSON表示形式(即用
\n
替换新行,在每个引号前加一个斜杠,并用引号括起来)。@H77-它不是JSON!问题很清楚地说明了这一点。解析它将抛出一个错误。这相当于使用eval()@MauricePerry,我尝试使用
eval()
,它抛出一个错误
未捕获的语法错误:意外标记:
是的,这很奇怪。评估(“obj=”+数据);works though也可以工作:var json=eval(“json.stringify”(+data+));
        var re = /"(?:[^"\\]|\\.)*"/g;
        var rs;
        var start = 0;
        var json = "";
        while (rs = re.exec(text)) {
            var end = rs.index;
            json += text.substring(start,end).replace(/([A-Za-z0-9]+)\:/g, "\"$1\":") + rs[0];
            start = end + rs[0].length;
        }
        json += text.substring(start).replace(/([A-Za-z0-9]+)\:/g, "\"$1\":");
        console.log(json);