1

在我正在处理的程序中,我使用 JSON.stringify 将文字变量发送到本地存储。计划是我想不断更新本地存储并添加到现有的本地存储中。我在 JSON 文件的解析方面遇到问题。我添加到存储的代码是这样的:

function addtoStorage(key, data) {
    if (typeof(Storage) !== "undefined") {
    if (localStorage[key]) {
        console.log("Local Storage stuff" + localStorage[key]);
        var olddata = JSON.parse(localStorage[key]);
        var dataJSON = JSON.stringify(olddata + data);
        localStorage[key] = localStorage[key] + dataJSON;
    }
    else {
        var dataJSON = JSON.stringify(data);
        localStorage[key] = dataJSON;
    }
}
else {
    console.log("You don't have storage capabilities. Sorry. Next time improve your browser.");
}

} ;

我在 console.log 上的输出是:

Local Storage stuff{"asdf":"","tes":6,"type":"asdf","ast":1,"sd":"","ew":"","asdf":{"te":0,"wer":0},"asf":"","te":"","context":{"asdf":1,"total_hits":0,"asdf":1,"tew":0,"asdf":"","tes":"","date":"asfd-asdf-","asdf":0},"asdf":""}"[object Object][object Object]" main.js:487

未捕获的 SyntaxError:意外的字符串

我很确定我明白问题所在。我似乎无法弄清楚如何解决它。显然是过早地关闭了 JSON 对象,有什么建议吗???

4

2 回答 2

3

我认为您不应该这样做,olddata + data因为stringify是将 JavaScript 对象解析为 JSON 并且您不能只是将两个对象添加在一起。

您应该尝试实现一个对象合并功能,就像 jQuery 使用的那样:

function merge( first, second ) {
                var len = +second.length,
                        j = 0,
                        i = first.length;

                for ( ; j < len; j++ ) {
                        first[ i++ ] = second[ j ];
                }

                first.length = i;

                return first;
        }

然后就做

var newdata = merge(olddata, data);
var dataJSON = JSON.stringify(newdata);

https://github.com/jquery/jquery/blob/master/src/core.js#L390

于 2013-11-09T06:44:44.283 回答
1

Uncaught SyntaxError: Unexpected string来自JSON.parse,这是因为它不再是有效的 JSON ( http://json.org/ )

你正在做的是将一个对象添加到一个对象,结果是一个字符串

在此处输入图像描述

然后当你去字符串化它时,整个事情将只是第一次和第二次的字符串。所以它会顺利通过,然后当它第三次尝试解析它时,该函数将失败,因为您添加了一个带有字符串的 JSON 对象。

如果您只存储 JSON 对象,您可以使用 jQuery 的扩展功能 ( http://api.jquery.com/jQuery.extend/ )

或者,如果您要存储更多内容,则只需将对象全部更改为数组

这应该涵盖所有内容

function addtoStorage(key, data) {
    if (typeof(Storage) !== "undefined") {
        if (localStorage.getItem(key)) {
            console.log("Local Storage stuff" + localStorage.getItem(key));
            var olddata = JSON.parse(localStorage.getItem(key));
            var newdata = null;
            if(olddata instanceof Array){
                olddata.push(data);
                newdata = olddata;
            }else if(data instanceof Array || !(data instanceof Object) || !(olddata instanceof Object)){
                newdata = [olddata, data];
            }else if(data instanceof Object && olddata instanceof Object){
                newdata = $.extend(olddata, data);
            }
            var dataJSON = JSON.stringify(newdata);
            localStorage.setItem(key, dataJSON);
        }
        else {
            var dataJSON = JSON.stringify(data);
            localStorage.setItem(key, dataJSON);
        }
    }
    else {
        console.log("You don't have storage capabilities. Sorry. Next time improve your browser.");
    }
}
于 2013-11-09T06:59:37.690 回答