Typescript (Angular) - JSON 模型反序列化

Posted

技术标签:

【中文标题】Typescript (Angular) - JSON 模型反序列化【英文标题】:Typescript (Angular) - JSON model Deserialisation 【发布时间】:2022-01-06 11:21:01 【问题描述】:

我想在我的 http 模型中添加和填充其他字段(不是由后端服务发送的)。 问题是我无法在收到 http 响应的地方填充(映射)这些字段,因为我使用的是内部框架。

Typescript (Angular) 中是否有可能以某种方式覆盖 JSON 反序列化流程/实例创建并填充提到的字段。例如:

interface ElectricDevice 
    
    energy_meter_start: number; // received from backend service
    energy_meter_stop: number; // received from backend service

    energy_spent: number; // not received by backend service, but needs to be populated as energy_meter_stop - energy_meter_start

    // ...

    /* I would like to somehow populate energy_spent as energy_meter_stop-energy_meter_end on instance creation (deserialisation) */



【问题讨论】:

您能否补充您的问题,您是如何进行 http 调用的?或者至少是您订阅进行 http 调用的服务时的部分。谢谢! 【参考方案1】:

您需要一个HttpInterceptor,您可以在其中操作数据。


@Injectable()
export class CustomJsonInterceptor implements HttpInterceptor 
  constructor(private jsonParser: JsonParser) 

  intercept(httpRequest: HttpRequest<any>, next: HttpHandler) 
    if (httpRequest.responseType === 'json') 
      // If the expected response type is JSON then handle it here.
      return this.handleJsonResponse(httpRequest, next);
     else 
      return next.handle(httpRequest);
    
  

在教程中了解更多信息:https://angular.io/api/common/http/HttpInterceptor

【讨论】:

【参考方案2】:

我已询问您服务的具体名称。

但是,与此同时,我给你一个“一般”的回答你的问题。 你只需要这样做:

this.yourService.yourGetElectriceDevices
.pipe(
   map (_resp: ElectricDevice  => _resp.energy_spent = _resp.energy_meter_stop - _resp.energy_meter_start
)
.subscribe( resp =>  //your treatment to the response );

以上内容仅适用于快速测试。 如果您想做一些更“详细”的事情,您可以将您的界面转换为一个类,并添加您的计算属性,如下所示:

export interface ElectricDevice 
    
    energy_meter_start: number; // received from backend service
    energy_meter_stop: number; // received from backend service
  


export Class ElectricDeviceClass 

energy_meter_start: number;
energy_meter_stop: number;

energy_spent: number; 


constructor (data: ElectricDevice)  
   this.energy_meter_start = data.energy_meter_start;
   this.energy_meter_stop= data.energy_meter_stop;

   this.energy_spent = this.energy_meter_stop - this.energy_meter_start;

为了使用它,只需:

import  ElectricDeviceClass, ElectricDevice  from './../model/...' // There where you have yours interfaces and model classes

this.yourService.yourGetElectriceDevices
.pipe(
   map (_resp: ElectricDevice  => new ElectricDeviceClass(_resp)
)
.subscribe( resp =>  //your treatment to the response );

【讨论】:

不幸的是,正如我所提到的,我正在使用特定的内部框架来处理 http 层,因此我无法执行建议的转换。我只能在模型级别上做一些有意义的事情。

以上是关于Typescript (Angular) - JSON 模型反序列化的主要内容,如果未能解决你的问题,请参考以下文章

angular.js:Typescript 类构造函数“这是未定义的”

angular typescript 引入js文件

angular typescript 引入js文件

导入的类不能在带有 TypeScript 的 Angular.js 中用作服务

Angular 2 - typescript 函数与外部 js 库的通信

通过 npm 为 Angular 2 TypeScript 项目安装 d3.js 有啥好处吗?