JSON.stringify() - 对象的自定义序列化器
Posted
技术标签:
【中文标题】JSON.stringify() - 对象的自定义序列化器【英文标题】:JSON.stringify() - object's custom serializer 【发布时间】:2019-03-24 12:40:39 【问题描述】:假设我有一个对象:
const a =
foo: 123,
bar: 'example'
这个对象是许多其他对象的一部分,即
const b =
a: a,
anotherField: "example"
实际上,我使用的是 TypeScript,所有这些对象都属于同一类,我认为这并不重要。
将b
对象序列化为 JSON 后,我需要获取此字符串(即我只是从 a
获取 foo
字段):
a: 123, anotherField: "example"
告诉JSON.stringify()
如何将a
对象转换为字符串的最简单、最优雅的方法是什么?
可能类似于Python
允许的内容。
【问题讨论】:
当然,您还有另一个问题,因为JSON.stringify
将转换为该js 对象的字符串。
其实没有。 JSON.stringify 只是将对象转换为符合 JSON 的字符串,您可以在 序列化它之前转换对象。在我看来,这与语言无关,只是一个糟糕的设计。
【参考方案1】:
您可以在a
中定义toJSON
。
如果被字符串化的对象有一个名为 toJSON 的属性,其值为一个函数,则 toJSON() 方法自定义 JSON 字符串化行为:而不是被序列化的对象,调用时 toJSON() 方法返回的值将是序列化。
(来源:MDN)
例如:
class A
constructor(foo, bar)
this.foo = foo;
this.bar = bar;
toJSON()
return this.foo;
const a = new A(123, "some name");
const b =
a: a,
anotherField: "example"
;
console.log(JSON.stringify(b)); // ""a":123,"anotherField":"example""
【讨论】:
嘿,这看起来正是我想要的!非常感谢!【参考方案2】:您可以在字符串化时使用替换器:
const result = JSON.stringify(b, (k, v) => v && v.stringify() || v);
这样您就可以轻松地将自定义字符串化添加到a
:
const a =
foo: 123,
bar: 'example',
stringify() return this.foo;
【讨论】:
以上是关于JSON.stringify() - 对象的自定义序列化器的主要内容,如果未能解决你的问题,请参考以下文章