json - 通过转换将 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
}
}
解决方案
默认Date.prototype.toJSON
已经使用 ISO 字符串,所以你不需要做dob.toISOString()
你所拥有的很好,通常也是我更喜欢的(显式序列化/反序列化)。我也有关于这个主题的视频。
但是,如果你想使用序列化库,我建议使用两个使用装饰器的TypeScript:
- mobx 生态系统的一部分(这是我喜欢的另一件事)https://github.com/mobxjs/serializr
- 一个不太受欢迎但同样令人印象深刻的库:https ://github.com/danrevah/typeserializer