2017-07-28 174 views
1

我已經閱讀了JSON外觀的文件,格式類似於以下內容:格式爲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" 
    } 
} 

我曾想過的邏輯,我有一個結論(我認爲這是罰款):我要補充「'到每一行的開始和結束之間「:」過,但我不能夠做到這一點與正則表達式

是否有更簡單的方法

+1

@George - 如何將文件中的數據解析爲JavaScript變量,以便使用JSON.stringify? – Quentin

+0

@Quentin我不好,我沒有正確地閱讀這個問題。將文件本身的數據更改爲JSON而不是在代碼中亂用它會不會更容易?作爲解析數據的唯一方法是使用'eval()' – George

+0

@George首先,感謝您的答案。我無法編輯該文件,因爲它位於服務器上,而且我只具有讀取權限。這是我試圖用正則表達式解決它的主要原因。 –

回答

-1
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對象

+0

不是有效的json,所以你不能使用JSON.parse。 –

+1

@VíctorLópezJSON.stringify的結果是有效的JSON, –

+1

問題在於詢問如何用JavaScript讀取文件,然後解析其中的數據。您的建議似乎是「手動編輯文件以將其轉換爲JavaScript程序,然後執行該程序」,這似乎並沒有太大關係。 – Quentin

-1

可能不是最好的方法,但您可以創建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);

雖然你說

I can't edit the file, because it's on a server and I only have read access.

我會請求的文件變更爲格式,可以更容易地轉移無論是XML或JSON。

+0

這相當於使用eval() –

+0

@MauricePerry我嘗試使用'eval()'並且它會引發錯誤'Uncaught SyntaxError:意外的令牌:' – George

+0

是的,那很奇怪。 eval(「obj =」+ data);雖然 –

0

此:

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

UPDATE:

你實際上可以通過合併不同的傳遞來簡化:

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