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() - 对象的自定义序列化器的主要内容,如果未能解决你的问题,请参考以下文章

将自定义javascript对象转换为json [重复]

在 fabricjs 对象上应用 JSON.stringify 后自定义属性丢失

JSON格式的转换

JSON.stringify()和JSON.parse()

JSON.stringify()和JSON.parse()

JSON对象的解析,JSON.stringify()/JSON.parse()的用法