首页 > 解决方案 > 通过转换将 JSON 序列化/反序列化为 TypeScript

问题描述

我正在尝试将 TypeScript 对象序列化为 JSON,反之亦然。转换时,必须转换某些字段,例如Date对象到 ISO 8601 字符串,枚举到有线格式所需的值等。我目前正在为 TypeScript 对象和 JSON 对象创建类型定义(尽量避免键入 JSON对象为any)。这样做有更好的模式吗?

例子

打字稿对象:

{
  name: 'John Smith',
  title: 'Sr. Developer',
  dob: new Date('1990-05-01T09:00:00Z');
}

JSON对象:

{
  "name": "John Smith",
  "title": "Sr. Developer",
  "dob": "1990-05-01T09:00:00Z";
}

这是序列化/反序列化的代码 + 两种格式的类型定义:

interface Person {
    name: string;
    title: string;
    dob: Date;
}

interface JsonPerson {
    name: string;
    title: string;
    dob: string; // ISO 8601 format
}

function serialize(person: Person): JsonPerson {
    const { dob, ...rest } = person;
    return {
        dob: dob.toISOString(),
        ...rest
    }
}

function deserialize(jsonPerson: JsonPerson): Person {
    const { dob, ...rest } = jsonPerson;
    return {
        dob: new Date(dob),
        ...rest
    }
}

标签: jsontypescript

解决方案


默认Date.prototype.toJSON 已经使用 ISO 字符串,所以你不需要做dob.toISOString()

你所拥有的很好,通常也是我更喜欢的(显式序列化/反序列化)。我也有关于这个主题的视频

但是,如果你想使用序列化库,我建议使用两个使用装饰器的TypeScript


推荐阅读