【问题标题】:How to instruct JSON.stringify() to custom serialize Date types?如何指示 JSON.stringify() 自定义序列化日期类型?
【发布时间】:2020-03-20 19:00:03
【问题描述】:
class MyClass {
  myString: string;
  myDate: Date;
}

function foo() {
  const myClassArray: MyClass[] = ....
  return JSON.stringify(myClassArray); // or expressApp.status(200).json(myClassArray);
}

foo 将使用myDate 重新调整json 字符串,该字符串遵循YYYY-MM-DDThh:mm:ssZ 的ISO 标准。

我希望能够自定义 JSON.stringify() 如何序列化 myDate

我不拘泥于 JSON.stringify() 来实现我想要的,虽然我更喜欢它,因为 express.json() 在幕后使用它。如果这是不可能的,是否有一个序列化库可以帮助我实现我想要的?也许是一个实现装饰器模式的库?或者更原生的解决方案?

【问题讨论】:

  • JSON.stringify 不解析东西...?
  • 进入 JSON.stringify() 的对象以字符串结尾。不就是解析吗?
  • 不,那是序列化。您可以使用 stringify 的第二个参数来包含基于值类型的自定义逻辑。
  • 我试过了,但是替换功能非常有限(或者我没弄明白)。例如,如果我传递一个数组,那么当我传递对象本身时。
  • 可能想edit 询问您如何尝试使用替换功能。这可能是你忽略的东西。

标签: javascript typescript


【解决方案1】:

您可以使用replacer 参数并传入一个函数。可能有一种更简洁的方法可以做到这一点,但这是一个简单的例子:

const data = [{
    date: new Date(),
    id: 1
  },
  {
    date: new Date(),
    id: 2
  }
]


const a = JSON.stringify(data)
const b = JSON.stringify(data, replacer('date'))

function replacer(target) {
  return function(key, value) {
    if (key == target) {
      const month = new Date(value).getMonth()
      return `Date month: ${month}`
    }
    return value
  }
}

// [{"date":"2020-03-20T19:13:11.594Z","id":1},{"date":"2020-03-20T19:13:11.594Z","id":2}]
console.log(a)

// [{"date":"Date month: 2","id":1},{"date":"Date month: 2","id":2}]
console.log(b)

编辑

我的 TypeScript 装饰器功夫不是最强的,所以如果有人有任何建议,请随时指出改进。

作为装饰者:

@transformDate
class MyClass {
  date: Date;
  id: number;

  constructor(date, id) {
    this.date = date;
    this.id = id;
  }
}

function transformDate(target: any) {
  const formatted = new Intl.DateTimeFormat("en", {
    year: "numeric",
    month: "short",
    day: "2-digit"
  }).format(this.date);

  target.prototype.toJSON = function() {
    return {
      ...this,
      date: formatted
    };
  };

  return target;
}

const data = [new MyClass(new Date(), 1), new MyClass(new Date(), 2)];

// [{"date":"Mar 20, 2020","id":1},{"date":"Mar 20, 2020","id":2}]
console.log(JSON.stringify(data));

【讨论】:

  • 我想我的代码中有一个错误,因为这应该可以工作。有我可以遵循的装饰器模式吗?直接注释类?这样我就不用每节课都这样做了?
  • @Kam 我添加了一个装饰器示例
猜你喜欢
  • 1970-01-01
  • 2016-11-11
  • 2019-03-24
  • 2015-01-30
  • 2021-11-19
  • 1970-01-01
  • 1970-01-01
  • 2012-06-07
  • 2010-09-23
相关资源
最近更新 更多