总体来说,我对JavaScript / Typescript还是很陌生,我遇到了一个我不知道如何处理的类的序列化问题。
我通过REST或数据库请求创建对象,如下所示:
export interface ILockerModel {
id: string
lockerId: string
ownerId: string
modules: IModuleModel[]
}
export class LockerModel implements ILockerModel {
private _id: string
private _lockerId: string
private _ownerId: string
private _modules: ModuleModel[]
constructor(document: ILockerModel) {
this._id = document.id
this._lockerId = document.lockerId
this._ownerId = document.ownerId
this._modules = document.modules.map(m => new ModuleModel(m))
}
// Utility methods
}
然后,我有了多种实用程序方法,这些方法可以更轻松地使用模型,在列表中添加和删除内容等。
完成后,我想将该对象持久保存到文档数据库中或以REST响应形式返回它,所以我叫JSON.stringify(objectInstance)
。但是,这给了我类,但所有属性都带有下划线(_
),而不是我的getter值。这破坏了我应用程序其他部分的反序列化。
序列化接口给了我想要的东西,但是我还没有找到一种从类到接口表示的直接方法。这个问题变得更加棘手,因为我在层次结构中反序列化了数据(请参阅构造函数中的模块映射)。
您通常如何解决此问题?
答案 0 :(得分:1)
据我所知,您并没有真正实现ILockerModel
。这不应该引发错误吗?
运行它时,我得到以下信息:
类型'LockerModel'缺少类型'ILockerModel'中的以下属性:id,lockerId,ownerId,模块
另一件事是JSON.strigify()
只是获取您的对象并对其所有属性进行字符串表示。它不在乎您的吸气剂。如果希望将其转换为正确的格式,则应为其提供正确格式的对象。
一种解决方案是仅使用map
和reduce
的组合从所有键中删除'_':
const input = {
_test: 123,
_hello: 'world'
};
console.log(input);
console.log(JSON.stringify(input));
const convertToJson = (obj) => {
return Object.entries(obj) // Create array from object
.map(([key, value]) => [ // change key to remove '_'
key.startsWith('_') ? key.substring(1) : key,
value
])
.reduce((acc, [key, value]) => { // Transform back to object
acc[key] = value;
return acc;
}, {});
}
const output = convertToJson(input);
console.log(output);
console.log(JSON.stringify(output));
或者如果允许您使用ES10:
const input = {
_test: 123,
_hello: 'world'
};
console.log(input);
console.log(JSON.stringify(input));
const convertToJson = (obj) => {
return Object.fromEntries( // Create Object from array
Object.entries(obj) // Create array from object
.map(([key, value]) => [ // change key to remove '_'
key.startsWith('_') ? key.substring(1) : key,
value
])
);
}
const output = convertToJson(input);
console.log(output);
console.log(JSON.stringify(output));