【问题标题】:Format to JSON with regex使用正则表达式格式化为 JSON
【发布时间】:2017-07-28 09:11:23
【问题描述】:

我读取了一个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"
    }
}

我已经考虑过逻辑并且我有一个结论(我认为这很好):我必须在每行的开头和结尾以及“:”之间添加'''。但我无法做到用正则表达式做到这一点。

有没有更简单的方法?

【问题讨论】:

  • @George — 如何将文件中的数据解析为 JavaScript 变量,以便使用 JSON.stringify?
  • @Quentin 我的错,我没有正确阅读问题。将文件本身中的数据更改为 JSON 而不是在代码中乱七八糟地处理它不仅更容易吗?我能看到解析数据的唯一方法是使用eval()
  • @George 首先,感谢您的回答。我无法编辑该文件,因为它在服务器上,而我只有读取权限。这就是我试图用正则表达式解决它的主要原因。
  • @H77 — 当文件在变量中时,它将是一个字符串,而不是一个对象。 JSON.stringify 将只创建该字符串的 JSON 表示形式(即用 \n 替换新行,在每个引号前加一个斜杠并将其括在引号中)。
  • @H77 — 这不是 JSON!这个问题很清楚地说明了这一点。解析它会抛出一个错误。

标签: javascript json regex


【解决方案1】:

这个:

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);

更新:

您实际上可以通过合并不同的通道来简化此过程:

        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);

【讨论】:

    【解决方案2】:
        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 对象

    【讨论】:

    • 不是有效的 json,所以不能使用 JSON.parse。
    • @VíctorLópez JSON.stringify 的结果是有效的 JSON,
    • 问题是询问如何使用 JavaScript 读取文件,然后解析其中的数据。您的建议似乎是“手动编辑文件以将其转换为 JavaScript 程序,然后执行该程序”,这似乎与此没有太大关系。
    【解决方案3】:

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

    var data = '{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"}}'
    
    var script = document.createElement("script");
    script.innerText = "var test = "+data;
    document.body.append(script);
    
    console.log(test.varParent1.var2);
    console.log(test);

    虽然你说过

    我无法编辑该文件,因为它在服务器上,而我只有读取权限。

    我会要求将文件更改为更容易传输的格式,无论是 XML 还是 JSON。

    【讨论】:

    • 这相当于使用eval()
    • @MauricePerry 我尝试使用eval() 并抛出错误Uncaught SyntaxError: Unexpected token :
    • 是的,这很奇怪。 eval("obj = " + 数据);虽然有效
    • 也可以:var json = eval("JSON.stringify(" + data + ")");
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 2010-12-13
    • 2019-09-15
    • 2020-09-14
    • 1970-01-01
    相关资源
    最近更新 更多