【问题标题】:JSON stringify and then parse works unexpectedly for the object with local variableJSON stringify 然后解析对具有局部变量的对象意外工作
【发布时间】:2015-04-10 03:26:11
【问题描述】:

为什么 JSON 字符串化然后解析不适用于此对象。它对带有局部变量的对象是否有效?

function Task(description) {
    var _description = description;

    this.getDescription = function() {
        return _description;
    }
}

var task = new Task('wash car');
console.log(task.getDescription());
var json = JSON.stringify(task);
console.log(JSON.parse(json).getDescription());

【问题讨论】:

  • 您无法将字符串解析为具有函数的对象。它如何知道具有相同字段名称的两个对象之间的区别?
  • 当你 JSON.stringify 一个对象时,函数被省略。更何况,所有的引用都被销毁了,所以它不会再是Task的实例了
  • 我需要将对象保存在本地存储中,然后获取它。我怎样才能做到这一点?
  • @TharinMeggettII task 不仅仅是一个简单的对象,这就是为什么单独使用 json.stringify 和 json.parse 不足以解决这个问题。在对task 进行字符串化之后,您将拥有的是"{}"

标签: javascript json parsing stringify


【解决方案1】:

JSON 不能对函数进行字符串化(而且它不应该能够)。

但从技术上讲,当您需要对对象进行字符串化时,您不应该需要这些函数。您可以在应用程序中按原样传递对象。

编辑:

如果您需要的是要在本地存储的对象,那么将函数与其一起保存并不是一个好主意。您可以做的是存储对象的属性并在检索它时创建一个新实例。

【讨论】:

    【解决方案2】:

    不可能对构造函数的实例进行字符串化,并且在将其转换回对象后仍然是构造函数的实例。

    相反,您需要为 Task 实例提供一个方法,该方法输出一个可以存储的 json 字符串,然后当您希望它再次成为 Task 的实例时,您可以创建一个新实例。

    function Task(description) {
        var _description = description;
    
        this.getDescription = function() {
            return _description + '(possibly modified?)';
        }
    
        this.stringify = function () {
            return JSON.stringify({
                description: this.getDescription(), 
                _description: _description
            });
        }
    
    }
    
    var task = new Task('wash car');
    console.log(task.getDescription()); // 'wash car (possibly modified?)'
    var json = task.stringify();
    console.log(json); // {"description": "wash car (possibly modified?)", "_description": "wash car"}
    var taskAgain = new Task(JSON.parse(json)._description);
    console.log(taskAgain.getDescription());  // 'wash car (possibly modified?)'
    

    我添加了" (possibly modified?)" 来演示为什么传递getDescription 的结果和存储在_description 中的字符串很重要。如果getDescription 永远不会更改描述,那么首先就不需要getDescription,这大大简化了整个过程。

    function Task(description) {
        this.description = description;
    }
    
    var task = new Task('wash car');
    console.log(task.description); // wash car
    var json = JSON.stringify(task);
    console.log(json); // {"description": "wash car"}
    console.log(JSON.parse(json).description); // wash car
    var taskAgain = new Task(JSON.parse(json).description);
    console.log(task.description); // wash car
    

    【讨论】:

      猜你喜欢
      • 2016-08-11
      • 2015-05-11
      • 2020-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-26
      • 1970-01-01
      相关资源
      最近更新 更多