gpt4 book ai didi

javascript - 如何在自定义 toJSON 方法中使用 JSON.stringify?

转载 作者:IT老高 更新时间:2023-10-28 12:54:40 29 4
gpt4 key购买 nike

因此,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 方法本身操作)?

最佳答案

Crockford's json2.js说:

A toJSON method does not serialize: it returns the value represented by the name/value pair that should be serialized, or undefined if nothing should be serialized.

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

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

关于javascript - 如何在自定义 toJSON 方法中使用 JSON.stringify?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4289282/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com