Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/466.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用stringify将嵌套JSON用于本地存储_Javascript_Json - Fatal编程技术网

Javascript 使用stringify将嵌套JSON用于本地存储

Javascript 使用stringify将嵌套JSON用于本地存储,javascript,json,Javascript,Json,我有一个嵌套的JSON对象,由 var data = { "animal": { "canine": "dog", "feline": "cat" }, "bug": "beetle", "carrot": { "color": "orange", "type": "vegetable" }, "population": 100 }; 我一直在尝试使用JSO

我有一个嵌套的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,那也将非常好。

我创建了一个适合我的解决方案

我编写了一个递归函数,通过对象使用预排序算法。它还不完整,可以进行明显的改进,使其更通用,尤其是对于对象数组之类的东西,但我发现它在基本级别上运行得相当好

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函数可从

在结尾添加一个逗号会有问题,所以要删除它,我再次使用substring。例如,对于原始问题中定义的数据,可以由

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

请随意查找此方法的改进。

我无法重现问题:我在chrome控制台中运行了您的代码,它似乎工作正常。你是如何获得价值的?localStorage.getItemmyData返回正确的结果。是否在localStorage.setItem之前立即尝试了console.log?我过去使用过JSON.stringify精细本地存储。。。您还可以显示代码检索值,以及浏览器和版本的详细信息吗?我使用的是chrome,以前我对嵌套对象使用过JSON.stringify,它工作正常,但这次出现了问题。尤其是对于更复杂的对象。我创建对象的方式可能有问题,但我已成功解决了遇到的情况下的问题。可能是您使用带字符串键的数组而不是对象吗?这将是预期的结果。这几乎肯定是错误的方法。你应该改为修复你的数据。我的数据绝对是对象的对象。我能够将数据转换成类似于我希望在localStorage中使用的格式(即JSON)的字符串。这种方法冗长乏味,但它奏效了。我只是想发布我的答案,以防它对其他人有帮助。糟糕的答案。Stringify正是您所需要的。
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