2016-06-12 76 views
-1

我是因爲有第二個是空值如下重複鍵一個JSON文件:的Javascript:JSON解析而不覆蓋現有的密鑰

var jsonString = '{"dup": 1, "dup": null}';

在做JSON.parse(jsonString),「DUP」變爲「空值」。

我需要的是,如果第二個「dup」爲空,則保持「dup」等於「1」。所以,如果有喜歡的任何功能,我想知道:

var noNullJson = jsonString.removeNull(); JSON.parse(noNullJson); //{"dup": 1}

或者,如果有在Javascript任何函數調用JSON.parse時不允許覆蓋的關鍵。

感謝您閱讀此問題。任何幫助深表感謝。

+1

爲什麼不合式JSON嘗試,沒有重複的鑰匙? – n00dl3

+2

JSON從哪裏來?你能影響它的建設嗎? –

+0

帶重複鍵的JSON有效,但建議避免。 –

回答

2

我寫了一個函數,它將刪除null並解析json。 大多數我用這種方法嘗試過的排列組合。

你可以運行代碼,在這裏我也給出了4個不同型號的測試用例。

希望,這會有所幫助。

[P.S.這個邏輯只適用於Flat JSONs(JSONs沒有嵌套對象)

function removeNullAndParseJson(jsonString) { 
 
    var commaSplitedArr = jsonString.split(','), 
 
    \t finalSplittedArr = []; 
 
    commaSplitedArr.forEach(function(d, index){ 
 
    \t if(d.indexOf('null') !== -1){ 
 
    \t \t if(index === 0){ 
 
    \t \t \t finalSplittedArr.push(d.replace(/[^{}\[\].]/g, "")); 
 
    \t \t }else { 
 
    \t \t \t finalSplittedArr[finalSplittedArr.length-1] += d.replace(/[^{}\[\].]/g, ""); 
 
    \t \t } 
 
    \t }else { 
 
    \t \t finalSplittedArr.push(d); 
 
    \t } 
 
    }); 
 
    return JSON.parse(finalSplittedArr.map(function(d){return d.replace("{}", "");}).join(',')); 
 
} 
 

 
//----Testing----- 
 
var jsonString; 
 

 
//test case1 
 
jsonString = '{"dup": 1, "dup": null}'; 
 
console.log('test1 -- ', removeNullAndParseJson(jsonString)); 
 

 
//test case2 
 
jsonString = '[{"dup": 1, "dup": null}, {"dup": 2, "dup": null}]'; 
 
console.log('test2 -- ', removeNullAndParseJson(jsonString)); 
 

 

 
//test case3 
 
jsonString = '[{"dup": 1, "dup": null}, {"dup": 2, "dup": null}, {"dup": null, "dup": null}]'; 
 
console.log('test3 -- ', removeNullAndParseJson(jsonString)); 
 

 

 
//test case4 
 
jsonString = '[{"dup": 1, "dup": null}, {"dup": null, "dup": null}, {"dup": 2, "dup": null}]'; 
 
console.log('test4 -- ', removeNullAndParseJson(jsonString));

+1

雖然我有一個嵌套對象,但這似乎會中斷:'jsonString ='[{「Key」:「2522」,「Value」:{「foo」 :{「a」:null,「b」:false,「c」:2}}}]';' –

+0

是的。它正在爲具有嵌套對象的'JSON'打破。 將向解決方案添加備註。謝謝 :) –

0

您可以嘗試解析像以前那樣將其重命名;

var jsonString = '{"dup": 1, "dup": null}', 
 
      jObj = JSON.parse(jsonString.replace(/(dup).+(\1)/,"$&" + "2")); 
 
console.log(jObj);