2015-09-15 16 views
0

我有一個JSON字符串化的對象,如下所示。我需要使用JSON.parse解析對象。我面臨着我想用RegEx替換的嵌套雙引號。用JavaScript替換嵌套的雙引號RegEx

// input string 
var stringifyObj = '{ 
"a": "abcd"", 
    "b": false, 
    "c": [ 
    { 
     "c": "1234", 
     "d": "abcd", 
     "e": [ 
     { 
      "cs": "cs", 
      "df": true 
     } 
     ], 
     "g": "USE", 
     "f": false, 
     "g": "QA DCG", 
     "h": "333 Market St", 
     "i": "San Francisco", 
     "j": " 94568" 
    }, 
    { 
     "k": "20570", 
     "l": "test", 
     "m": [ 
     { 
      "n": "USD", 
      "o": true 
     } 
     ], 
     "p": "US", 
     "q": true, 
     "r": "Wires_defect 13205 testing", 
     "s": "333 market street_retesting 13205", 
     "t": "SF_test", 
     "u": "ABCD"", 
     "v": false 
    } 
    ] 
}'; 

如何解析此字符串化對象「a和u」屬性包含嵌套的雙引號。

我試圖取代,但沒有奏效:replace(/(".*?"):(".*?)"(.*?")/g,"$1:$2\\\"$3")

+3

那不是一個字符串化的對象。這個JSON從哪裏來? – melpomene

+0

你到現在爲止嘗試過什麼?你的表情是什麼?順便說一句。預期輸出不能正確'...'''@ ...'似乎錯了不應該是'... \「@ ...' –

+0

@winner_joiner我編輯過plz檢查 – venkat7668

回答

0

取決於預期的字符串,報價多少,特殊字符的值,依此類推......

但對於這種特殊的情況下,你可以利用這一點,或至少把它作爲出發點

var bad_json_string = '{"a":"abc"@#"}'; 
 
var cleaned_string = bad_json_string.replace(/([^:]+:")(.*)"(.*"})/g, function(){return RegExp.$1 + RegExp.$2 +"'"+ RegExp.$3 }); 
 

 
document.write(cleaned_string); 
 
// tested on Win7 with chrome 44+

更新1:

更新的json不容易通過javascript RegExp Expression修復。使用嵌套列表/對象/ ...

我會建議從服務器清理JSON,如果這是不可能的,我會寫一個函數來以另一種方式「解析」字符串。

更新2:

一個可能的功能,解決方案可能/應該是這樣的(只是快速演示,審閱/ 優化生產使用

var bad_json_string = '{\r\n"a": "abcd"",\r\n "b": false,\r\n "c": [\r\n {\r\n  "c": "1234",\r\n  "d": "abcd",\r\n  "e": [\r\n  {\r\n   "cs": "cs",\r\n   "df": true\r\n  }\r\n  ],\r\n  "g": "USE",\r\n  "f": false,\r\n  "g": "QA DCG",\r\n  "h": "333 Market St",\r\n  "i": "San Francisco",\r\n  "j": " 94568"\r\n },\r\n {\r\n  "k": "20570",\r\n  "l": "test",\r\n  "m": [\r\n  {\r\n   "n": "USD",\r\n   "o": true\r\n  }\r\n  ],\r\n  "p": "US",\r\n  "q": true,\r\n  "r": "Wires_defect 13205 testing",\r\n  "s": "333 market street_retesting 13205",\r\n  "t": "SF_test",\r\n  "u": "ABCD"",\r\n  "v": false\r\n }\r\n ]\r\n}'; 
 

 
var t = bad_json_string.match(/^(.|)*$/gm); 
 

 
function unQuote(string){ 
 
\t return string.replace(/^"/,"").replace(/"$/,""); 
 
} 
 

 
function trim(string, chr){ 
 
\t return string.replace(new RegExp("^(" + (chr || " ")+")*"),"").replace(new RegExp("(" + (chr || " ") + ")*$"),""); 
 
} 
 

 
var clean = ""; 
 

 
function buildObj(list, idx){ 
 

 
\t if(list.length<=idx) 
 
\t \t return; 
 
\t \t 
 
    var item = trim(list[idx]); 
 
\t 
 
\t switch(item){ 
 
\t \t case "{": 
 
\t \t case "[": 
 
\t \t case "}": 
 
\t \t case "]": 
 
\t \t case "},": 
 
\t \t case "],": 
 
\t \t \t clean += item; 
 
\t \t \t break; 
 
\t \t case "": 
 
\t \t \t break; 
 
\t \t default: 
 
\t \t \t var line = item.split(":"); 
 
\t \t \t var index = unQuote(line[0]); 
 
\t \t \t var value = trim(trim(line[1]),","); 
 
\t \t \t clean += index + ":"; 
 
\t \t \t 
 
\t \t \t if(value.indexOf("\"")==0){ 
 
\t \t \t \t clean += "'"+ unQuote(value) + "',"; 
 
\t \t \t } 
 
\t \t \t else if(value.indexOf("{")==0 || value.indexOf("[")==0){ 
 
\t \t \t \t clean += value; 
 
\t \t \t } 
 
\t \t \t else{ 
 
\t \t \t \t clean += value + ","; 
 
\t \t \t } 
 
\t \t \t 
 
\t } 
 

 
\t buildObj(list, ++idx); 
 
} 
 

 

 
buildObj(t, 0); 
 

 
document.write(clean); 
 
// to get the object you could do this, but dont forget eval==evil. :) 
 
var t; 
 
eval("t="+clean); 
 
document.write("<br/><br/><br/>"); 
 
document.write("Object prop 'a' => " + t['a']); 
 
// tested on Win7 with Chrome 44+

+0

@ venkat7668你試過功能版嗎? –