当前位置: 首页 > 面试题库 >

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

龙弘盛
2023-03-14
问题内容

因此,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,这将… :-(

您可以通过以下方法解决此问题:

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

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


问题答案:

克罗克福德的json2.js说:

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

因此,仅希望您返回要序列化的值。在您的情况下,baz.toJSON应仅返回baz要序列化的对象部分:

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


 类似资料:
  • 如何在useEffect中使用自定义方法??如果我创建了许多组件,它们使用相同的fetch函数,我应该在每个组件的效果中声明fetch函数吗??这个函数做同样的工作?? 据我所知,如果我想在use效应中使用组件的状态,我应该声明并调用use效应中的函数,就像例子1一样。 但是我想声明其他js文件的函数。因为它被称为其他组件。 根据Dan Abramov(https://overreacted.io

  • 问题内容: 我正在使用Python的应用程序编写一些测试用例。现在,我需要将一个对象列表与另一个对象列表进行比较,以检查第一个列表中的对象是否符合我的期望。 如何编写自定义方法?应该怎么办?是否应该在失败时引发例外?如果是,哪个例外?以及如何传递错误消息?错误消息应该是unicode字符串还是字节字符串? 不幸的是,官方文档没有解释如何编写自定义断言方法。 如果您需要一个真实的示例,请继续阅读。

  • 假设我想有一个方法,它是获得超级主要客户,它有。 其中声明了方法。 然后我的公开存储库界面变成以下内容: 它扩展了和my。 我写的 bot不知道,在实现中写什么。如何接触客户?

  • 我正在使用IText7从html字符串生成pdf。现在,我需要对段落应用自定义颜色和自定义字体或字体系列。 如何使用Itext7实现这一点? 谢谢

  • 我目前正在尝试使用ByteBuddy作为java bean实现包装键/值对的,将map键公开为普通getter/setter。 我最初按照如下方式构造生成器,允许我将