【问题标题】:How do you use JSON.stringify in a custom toJSON method?如何在自定义 toJSON 方法中使用 JSON.stringify?
【发布时间】:2010-11-26 23:48:17
【问题描述】:

因此,JSON.stringify 提供了一种很好的方式来转换 JS 对象,例如:

var baz = {"foo":1, "bar":someFunction};

转换成 JSON 字符串,例如:

{"foo":1}

它使用一个可选的第二个参数来控制哪些字段应该被序列化:

JSON.stringify(baz, ["foo"]);

这很好,但有一个问题。假设您的“baz”实际上是另一个对象的属性,并且您想序列化另一个对象:

someObject.baz = {"foo":1, "bar":someFunction};
JSON.stringify(someObject, ["baz"]);

好吧,通常你只需在 baz 上定义一个 toJSON 方法,例如:

someObject.baz = {"foo":1, "bar":someFunction};
someObject.baz.toJSON = function() { /* logic to "toJSON" baz*/ }
JSON.stringify(someObject, ["baz"]);

现在,正如我之前提到的,我们已经有了“toJSON” baz 的完美逻辑:

someObject.baz.toJSON = function() {
    return JSON.stringify(baz, ["foo"]);
}

但是如果你尝试把它放到你的 toJSON 中,你会得到一个递归错误,因为 stringify 将触发 toJSON,这将触发 stringify,这将... :-(

您可以通过 hack 解决此问题:

someObject.baz.toJSON = function() {
    var oldToJON = this.toJSON;
    this.toJSON = null;
    var ret = JSON.stringify(baz, ["foo"]);
    this.toJSON = oldToJON;
    return ret;
}

但是……这似乎是错误的。所以,我的问题是:有什么方法可以利用 JSON.stringify inside 对象的 toJSON 方法的漂亮内置序列化功能(而不必在 stringify 期间隐藏 toJSON 方法本身操作)?

【问题讨论】:

    标签: javascript json


    【解决方案1】:

    Crockford's json2.js 说:

    一个 toJSON 方法不序列化:它返回由应该序列化的名称/值对表示的值,如果不应该序列化,则返回 undefined。

    所以你只需要返回你想要序列化的值。在您的情况下,baz.toJSON 应该简单地返回您想要序列化的 baz 对象部分:

    someObject.baz.toJSON = function() {
      return { foo: this.foo };
    };
    

    【讨论】:

    • 那么如果我只想序列化某些字段,我必须这样做:
    • someObject.baz.toJSON = function() { var ret = {}; for (var property in this) { if (!property in listOfPropertiesToSerialize) continue; ret[属性] = this[属性; } 返回 ret; };
    • 没有办法只提供字段列表并让内置的 JSON 内容(无论是 Crockford 的还是浏览器提供的)过滤掉,就像 stringify 方法那样?
    • @machineghost:你可以这样做,但要注意链式属性并确保使用this.hasOwnProperty(property)。如果您的属性列表是静态的,您可以只使用对象表示法直接构建一个新对象。 编辑:不,我不相信这是可能的。 toJSONstringify 的工作方式不同。
    • @machineghost:跳过过滤器并将toJSON 方法也添加到someObject,它只返回baz 属性。
    猜你喜欢
    • 2015-09-15
    • 2012-09-29
    • 2012-11-15
    • 2019-11-20
    • 1970-01-01
    • 2020-02-24
    • 2020-03-29
    • 2020-04-15
    • 1970-01-01
    相关资源
    最近更新 更多