【问题标题】:Best practices for stringifying JSON inner objects字符串化 JSON 内部对象的最佳实践
【发布时间】:2015-09-20 08:01:25
【问题描述】:

基本上我有这样的东西:

我的班级

var MyClass = function() {
  this.num = 123;
  this.obj = new MyInnerClass();
};

MyClass.prototype.stringify = function() {
  return JSON.stringify(this);
};

MyInnerClass

var MyInnerClass = function() {
  this.foo = 456;
  this.bar = 'bonjour!';
};

MyInnerClass.prototype.stringify = function() {
  return JSON.stringify(this, function(k, v) {
    // ignores 'foo' attribute
    return k !== 'foo' ? v : undefined;
  });
};

每个类都有自己的stringify 实现,所以当我这样做时:

var mc = new MyClass();
mc.stringify();

我希望调用MyClass.stringify 之类的东西应该对我的mc 对象进行字符串化,但要尊重内部对象stringify 的实现。一旦我们无法控制JSON.stringify 方法逻辑,有没有好的 方法可以做到这一点?

谢谢!

【问题讨论】:

    标签: javascript json node.js stringify


    【解决方案1】:

    如果你在 MDN 上查看 JSON.stringify,你会看到一个关于 toJSON 属性的部分

    如果被字符串化的对象有一个名为 toJSON 的属性,其值为一个函数,则 toJSON() 方法自定义 JSON 字符串化行为:而不是被序列化的对象,调用时 toJSON() 方法返回的值将是序列化。

    基本上,为您的 Object 定义一个 toJSON 方法,该方法创建另一个 Object,但可以根据需要进行序列化。然后JSON.stringify 将序列化您的toJSON 函数的返回,即

    var MyClass = function() {
      this.num = 123;
      this.obj = new MyInnerClass();
    };
    
    var MyInnerClass = function() {
      this.foo = 456;
      this.bar = 'bonjour!';
    };
    
    MyInnerClass.prototype.toJSON = function () {
        // shallow clone `this`, except .foo
        var o = Object.create(null), k, blacklist = ['foo'];
        for (k in this) // loop over enumerable properties
            if (Object.prototype.hasOwnProperty.call(this, k)) // ignore inherited properties
                if (blacklist.indexOf(k) === -1) // ignore blacklisted properties
                    o[k] = this[k]; // add to our clone
        return o;
    };
    
    JSON.stringify(new MyClass()); // '{"num":123,"obj":{"bar":"bonjour!"}}'
    

    这也将取代您对当前 stringify 方法的需求。


    遗憾的是,您不能在 .toJSON 内调用 JSON.stringify(this),因为它会变成循环并且您会得到 RangeError: Maximum call stack size exceeded,但无论如何您都不会以这种方式获得所需的结果,因为它会被第二次序列化,给您JSON 中的 String

    【讨论】:

    • 是的,我看到了关于 toJSON 的页面。所以这是唯一的方法。
    • 好吧,如果我在MyInnerClass 中有第三个内部对象,它也实现了stringify 方法,恐怕它不会工作。但我想我可以通过对这个功能进行一些调整来处理它。无论如何,谢谢,保罗。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    • 1970-01-01
    • 1970-01-01
    • 2012-09-15
    相关资源
    最近更新 更多