2013-10-09 27 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