使用stringify嵌套JSON以在localStorage中使用

时间:2014-12-18 06:56:28

标签: javascript json

我有一个由

给出的嵌套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,那也会很棒。

1 个答案:

答案 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

随意找到对此方法的改进。