不幸的是,我有一个遗留的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值的完全嵌套反序列化?
难道你不能简单地解析'fields'键:'JSON.parse(answer.fields);'? – nietonfir
@nietonfir不......不幸的是,这个例子中的json已经大大简化,仅仅展示了我目前面临的挑战。 – Brian