2017-01-22 54 views
0

我使用JSON.stringify()將javascript對象保存到localstorage。從localStorage修復損壞的json-javascript

localStorage.setItem('stored_object', JSON.stringify(objCases)); 

每隔一段時間,我會發現JSON字符串已經自發地從這個改變

{"9999999999999":{"case":"dummy","subj":"example","note":"placeholder"}} 

成這樣:

{asynchronous_key:'577b3620-8cbd-5251-b526-5882044f1386', jsonObject:{"\u0039\u0039\u0039\u0039\u0039\u0039\u0039\u0039\u0039\u0039\u0039\u0039\u0039":{"\u0063\u0061\u0073\u0065":"\u0064\u0075\u006d\u006d\u0079","\u0073\u0075\u0062\u006a":"\u0065\u0078\u0061\u006d\u0070\u006c\u0065","\u006e\u006f\u0074\u0065":"\u0070\u006c\u0061\u0063\u0065\u0068\u006f\u006c\u0064\u0065\u0072"}}} 

another question,用戶GoTo 0提供解決方案,但我很難實現它。我想我失去了一些東西基本:

jsFiddle Example

堆棧片段實例:

var badjson = {asynchronous_key:'49098507-12cd-e1b0-b442-5882cd1bf37e', jsonObject:{"\u0039\u0039\u0039\u0039\u0039\u0039\u0039\u0039\u0039\u0039\u0039\u0039\u0039":{"\u0063\u0061\u0073\u0065":"\u0064\u0075\u006d\u006d\u0079","\u0073\u0075\u0062\u006a":"\u0065\u0078\u0061\u006d\u0070\u006c\u0065","\u006e\u006f\u0074\u0065":"\u0070\u006c\u0061\u0063\u0065\u0068\u006f\u006c\u0064\u0065\u0072"}}}; 
 
localStorage.setItem('remindObj', JSON.stringify(badjson)); 
 
console.log('Here 03: '+ localStorage.getItem('remindObj')); 
 

 
var getjson = localStorage.getItem('remindObj'); 
 
console.log('Here 06: ' +getjson); 
 
console.log(typeof(getjson)); 
 
console.log(getjson.indexOf('asynchronous_key')); 
 
if (getjson.indexOf('asynchronous_key') > 0){ 
 
    console.log('ASYNCHRONOUS_KEY FOUND - Attempting to fix'); 
 
    originalJSONString = JSON.stringify(getjson.jsonObject); 
 
    console.log('FIXING: ' +originalJSONString); 
 
    objRemind = JSON.parse(originalJSONString); 
 
    localStorage.setItem("remindObj", originalJSONString); 
 
    console.log('FIXED: ' +localStorage.getItem("remindObj")); 
 
}

+0

_ 「每隔一段時間,我會發現JSON字符串已經自發地改變」 _你能形容 「自發地改變」? – guest271314

+0

@crashwap,你可以嘗試改變這一行:'originalJSONString = JSON.stringify(getjson.jsonObject);'到這裏:'originalJSONString = JSON.stringify(JSON.parse(getjson).jsonObject);'。這是否解決了您的問題? –

+0

問題出在這個問題上:'from this'是它如何被初始存儲在localStorage中,以及它在被檢索後如何出現 - 直到發生一些未知的破壞事件,並將LS項轉換爲'this into'格式。我沒有解釋如何/爲什麼LS項目正在改變,但正在發生。我懷疑這是我正在與之合作的企業OSS系統的產物,而我無法控制這個產品。 – crashwap

回答

0

,所以您可以關閉此:你有一個錯誤第11行(計算空行):應該是JSON.parse()而不是JSON.stringify()

編輯小提琴:https://jsfiddle.net/4n6dqqvn/1/

var storageKey = 'remindObj'; 
 
var badjson = { 
 
    asynchronous_key: '49098507-12cd-e1b0-b442-5882cd1bf37e', 
 
    jsonObject:{ 
 
    "\u0039\u0039\u0039\u0039\u0039\u0039\u0039\u0039\u0039\u0039\u0039\u0039\u0039":{ 
 
    "\u0063\u0061\u0073\u0065":"\u0064\u0075\u006d\u006d\u0079","\u0073\u0075\u0062\u006a":"\u0065\u0078\u0061\u006d\u0070\u006c\u0065", 
 
     "\u006e\u006f\u0074\u0065":"\u0070\u006c\u0061\u0063\u0065\u0068\u006f\u006c\u0064\u0065\u0072" 
 
    } 
 
    } 
 
}; 
 
localStorage.setItem(storageKey, JSON.stringify(badjson)); 
 

 
var getjson = localStorage.getItem(storageKey); 
 
console.log('Initial: ', getjson); 
 

 
if (typeof(getjson) === 'string'){ 
 
    console.log('ASYNCHRONOUS_KEY FOUND - Attempting to fix'); 
 
    var originalJSONString = JSON.parse(getjson).jsonObject; 
 
    console.log('FIXING: ', originalJSONString); 
 
    localStorage.setItem(storageKey, JSON.stringify(originalJSONString)); 
 
    console.log('FIXED: ', JSON.parse(localStorage.getItem(storageKey))); 
 
}

+0

這是GoTo0在評論中提供的答案,因爲您知道自從您離開答案几分鐘後參與了評論。作爲進一步的證據,你簡單地使用了他的答案,你將名字爲'originalJSONString'的變量留在變量中,然後將它變成一個對象。是的,你的例子有效,但它並沒有回答被問到的問題,而且似乎是遊戲系統的一個細微的嘗試,正如你自從四天前加入SO後的表現所證明的那樣。 -1 – crashwap

+0

json作爲字符串存儲在localstorage中。我只是將它記錄爲對象,因爲您可能總是希望在javascript中使用對象。另外:變量是這樣命名的,因爲我編輯你的小提琴,因爲我已經說過,並有那個變量名稱,我沒有改變 –