【问题标题】:Updating JSON file in Javascript在 Javascript 中更新 JSON 文件
【发布时间】:2013-11-09 06:24:59
【问题描述】:

在我正在处理的程序中,我使用 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

未捕获的语法错误:意外的字符串

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

【问题讨论】:

    标签: javascript json string parsing


    【解决方案1】:

    我认为您不应该使用 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

    【讨论】:

      【解决方案2】:

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

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

      然后当你去stringify它时,整个东西将只是第一次和第二次的字符串。所以它会顺利通过,然后当它第三次尝试解析它时,该函数将失败,因为您添加了一个带有字符串的 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.");
          }
      }
      

      【讨论】:

      • 1) 非常感谢。这个答案很有效。然而,在优化方面,这个答案每次都将所有数据重写到 localStorage。这似乎向 dataStorage 添加了不必要的操作。无论如何不读取和扩展整个存储值以提高效率?
      • 希望我的问题有道理。
      • 不,抱歉,您可以做到这一点的唯一方法是先读后写,如果您真的想对其进行优化,您可以在 localStorage 中保留一个对象作为键,另一个作为值,然后您可以为单个键创建一个键映射,然后在检索该值时可以将其扩展,而不是读取和写入。
      猜你喜欢
      • 1970-01-01
      • 2020-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多