2013-10-09 29 views
0

不幸的是,我有一個遺留的API端點,只支持扁平的JSON對象的輸出。其輸出之一看起來像這樣。部分扁平化的JSON的反序列化

{ 
    "objects": [ 
     { 
     "id": "1", 
     "last-modified": "0", 
     "created": "1", 
     "name": "Test", 
     "fields": "{\"k\":\"v\",\"k2\":\"v2\",\"k3\":[1,2,3],\"k4\":{}}" 
     } 
    ], 
    "attribs": {} 
} 

雖然這是有效的JSON,對象的任何嵌套部分將被字符串化並返回作爲整體對象只有一個鍵深。當我的JS檢索這個對象時,我試圖使用我編寫的遞歸函數反序列化對象的所有可反序列化的部分。

var loads = function (obj) { 
    var i, buffer; 
    if (obj instanceof Array) { 
     buffer = []; 
     for (i = 0; i < obj.length; i++) { 
      buffer.push(loads(obj[i])); 
     } 
     return buffer; 
    } else if (obj instanceof Object) { 
     buffer = {}; 
     for (i in obj) { 
      if (obj.hasOwnProperty(i)) { 
       buffer[i] = loads(obj[i]); 
      } 
     } 
     return buffer; 
    } else if (typeof obj === 'string') { 
     return JSON.parse(obj); 
    } else { 
     return JSON.parse(obj); 
    } 
}; 

顯然,遞歸是錯誤的,因爲很多「意外的標記」和「意外的標識符」錯誤都是由這個函數拋出。

我在這個函數中做了什麼錯誤,以防止字符串化JSON值的完全嵌套反序列化?

+0

難道你不能簡單地解析'fields'鍵:'JSON.parse(answer.fields);'? – nietonfir

+0

@nietonfir不......不幸的是,這個例子中的json已經大大簡化,僅僅展示了我目前面臨的挑戰。 – Brian

回答

1

使用第二個參數JSON.parse簡單地恢復一個安全的試塊中的代碼:

在OP測試代碼
JSON.parse(strOfJSON, function(k,v){ 
    try{v=JSON.parse(v)}catch(y){} 
return v 
}); 

輸出:

{ 
    "objects": [ 
     { 
      "id": 1, 
      "last-modified": 0, 
      "created": 1, 
      "name": "Test", 
      "fields": { 
       "k": "v", 
       "k2": "v2", 
       "k3": [ 
        1, 
        2, 
        3 
       ], 
       "k4": {} 
      } 
     } 
    ], 
    "attribs": {} 
} 

可以更大膽的嘗試和跳躍的嘗試{ }通過嘗試將json作爲字符串進行身份驗證,但是這個簡單樸素的代碼可以工作並顯示如何使用本機JSON.parse()函數來執行您想要的操作。

+0

工作就像一個魅力 - 瞭解reviver功能呢!今天是個好日子。 – Brian