我有一个由
给出的嵌套JSON对象var data = {
"animal":
{
"canine": "dog",
"feline": "cat"
},
"bug": "beetle",
"carrot":
{
"color": "orange",
"type": "vegetable"
},
"population": 100
};
我一直在尝试使用JSON.stringify来存储此信息
localStorage.setItem("myData", JSON.stringify(data));
但它不存储JSON对象的嵌套部分。例如,它忽略它而是显示
"动物":{}
我怎么能简单地解决这个问题?我已经看到了涉及修改ajax以实现同步的解决方案,但我并没有真正理解发生了什么。
我只是想要它,以便我可以在控制台中获取
console.log(JSON.stringify(data))
//{"animal":{"canine":"dog","feline":"cat"},"bug":"beetle","carrot":{"color":"orange","type":"vegetable"},"population":100}
所以如果有一个方法不使用stringify,那也会很棒。
答案 0 :(得分:0)
我创建了一个适合我的解决方案。
我写了一个递归函数,它通过对象使用预序算法。它不完整,可以做出明显的改进,使它更通用(尤其是对象数组或类似的东西),但它在基本层面上工作得很好。
function recursiveObjStr(obj, str)
{
str += "{";
for(var inst in obj)
{
str += "\"" + inst + "\"" + ":";
if(isArray(obj[inst]))
{
str += "[";
for(var inst2 in obj[inst])
{
str += "\"" + obj[inst][inst2] + "\"" + ",";
}
str = str.substring(0,str.length-1);
str += "]";
}
else if(typeof(obj[inst]) == "object")
{
str = recursiveObjStr(obj[inst], str);
}
else if(typeof(obj[inst]) == "function")
{
str += obj[inst];
}
else
{
if(!(isNaN(obj[inst])))
{
str += obj[inst];
}
else if(typeof(obj[inst]) == "boolean")
{
str += obj[inst];
}
else
{
str += "\"" + obj[inst] + "\"";
}
}
if(str[str.length-1] !== ",")
{
str += ",";
}
}
str = str.substring(0, str.length - 1);
str += "},";
return str;
}
使用此isArray()函数取自https://stackoverflow.com/a/218833/4309934
function isArray ( obj ) {
return isObject(obj) && (obj instanceof Array);
}
最后有一个额外的逗号有问题,所以要删除它我再次使用子字符串。例如,如原始问题中定义的数据,可以由
使用var str = "";
str = recursiveObjStr(data, str);
//console.log(str) gives {"animal":{"canine":"dog","feline":"cat"},"bug":"beetle","carrot":{"color":"orange","type":"vegetable"},"population":100},
str = str.substring(0, str.length-1);
//removes the comma
随意找到对此方法的改进。