angular - 如何将 SignalR 有效负载映射到 TypeScript 类?
问题描述
我们使用 signalR 从服务器请求使用的 cpu 和 ram:
// create connection
let hubConnection = new signalR.HubConnectionBuilder().withUrl("/MyUrl").build();
// response message
hubConnection.on("ReceiveMessage", (pMessage: string) => {
// convert to json
let lObj = JSON.parse(pMessage);
let lServerResources = new ServerResources(lObj.cpu, lObj.ram);
// do something with this result [...]
});
这是简单的 ServerResources 类:
// simple data class
export class ServerResources
{
constructor(public cpu: string, public ram: string)
{ }
}
问题:参数pMessage
包含一个 json 字符串作为值:'{"cpu":"72%","ram":"2540MB"}'
我们需要将其转换为 javascript 对象,然后映射到ServerResources
类。我们要保存这两个步骤。我们想ServerResources
直接得到一个-object。
我们尝试了以下方法。但它仍然是一个字符串:
hubConnection.on("ReceiveMessage", (pMessage: ServerResources) => {
// [...]
}
无论如何,Angular 通过泛型映射 http 请求的有效负载:
this.http.get<ServerResources>("MyUrl").pipe( [...] );
问题:我们如何将 singnalR 有效负载自动映射到 typescript 类?
解决方案
我写了一个通用函数来从 JSON 中水合 TypeScript 类:
function hydrate<T>(constr: { new(...args: any[]): T }, data: string, strictMode: boolean = true, ...args: any[]): T {
const obj = JSON.parse(data);
const instance = new constr(...args);
for (let key in obj) {
if (!strictMode || instance.hasOwnProperty(key)) {
instance[key] = obj[key];
}
}
return instance;
}
这是在您的特定情况下使用它的示例(我在类中添加了一个方法以进行说明):
class ServerResources {
constructor(public cpu: string, public ram: string)
{ }
getSomething() {
alert(this.cpu + ' ' + this.ram)
}
}
const data = `{ "cpu": "SUPER-8", "ram": "FAST-SHEEP"}`;
const example = hydrate(ServerResources, data, false);
example.getSomething();
推荐阅读
- android - 在 onClick 中未调用 Presenter
- scala - 管道的惯用解决方案 if
- google-apps-script - 您如何将 Logger.log(e) 与 Google 表单一起使用?(使用新的 Apps 脚本编辑器)
- .htaccess - 使用 .htaccess 忽略 URL 的最后一部分
- android - 权限未在android中显示(相机权限)没有错误
- python - pytest 多个命令行跳过选项
- python - Django rest 框架保存带有外键的序列化程序
- python - 使用 BeautifulSoup 进行网络抓取时收到此错误消息“TypeError: +: 'NoneType' and 'str' 的不支持的操作数类型”
- iso8583 - JPOS 消息头长度和消息体长度不匹配
- nestjs - Nestjs - 验证和转换查询参数