【问题标题】:JSON.stringify() - object's custom serializerJSON.stringify() - 对象的自定义序列化器
【发布时间】: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 的字符串,您可以在 序列化它之前转换对象。在我看来,这与语言无关,只是一个糟糕的设计。

标签: javascript json typescript


【解决方案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; }
 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-05
    相关资源
    最近更新 更多