当前位置: 首页 > news >正文

[Harmony]实现JSON与类的双向转换

使用reflect-metadata和class-transformer,实现JSON与类的双向转换。

一、介绍

reflect-metadata介绍

提供元数据存储和反射能力,可在类、属性或方法上附加自定义信息,并通过反射机制在运行时读取。

reflect-metadata关键修饰符:

1.@Reflect.metadata(key, value)

功能:为类/属性/方法附加元数据

参数:key:元数据标识符(字符串或Symbol) value:存储的任意类型数据

示例:

@Reflect.metadata('version', '1.0')
class MyClass {
@Reflect.metadata('type', 'string')
name: string = '';}

2.内置元数据类型

design:type:获取属性类型

design:paramtypes:获取方法参数类型

design:returntype:获取方法返回类型

class-transformer介绍

实现对象与JSON数据之间的双向转换,支持复杂类型的序列化/反序列化。

class-transformer核心修饰符:

1.@Expose(options?)

功能:控制属性序列化/反序列化可见性

参数:name:JSON字段别名 since/until:版本控制范围

示例:

@Expose({ name: 'user_name' })username: string = '';

2.@Type(typeFn)

功能:指定嵌套类型转换规则

参数:typeFn:返回目标类型的箭头函数

示例:

@Type(() => Date)createTime: Date;

3.@Transform(transformFn, options?)

功能:自定义值转换逻辑

参数:transformFn:转换处理器函数 groups:分组控制

示例:

@Transform(({ value }) => value.toUpperCase())
name: string;

 

‌二、应用

1.安装依赖

ohpm i class-transformer
ohpm i reflect-metadata  # 需配合装饰器使用 

2.基类Model

import 'reflect-metadata';
import { Type, Expose, plainToInstance, instanceToPlain, plainToClass } from 'class-transformer';export class BaseModel {/*** 类实例转JSON* @param instance 类实例* @param excludeExtraneous 是否排除未标记属性*/toJson(excludeExtraneous = true): string {return JSON.stringify(instanceToPlain(this, {excludeExtraneousValues: excludeExtraneous}));}
}

3.实际创建Model

import 'reflect-metadata';
import { Type, Expose } from 'class-transformer';
import { BaseModel } from '../../support/base/BaseModel';@Expose()
export class MFUserModel extends BaseModel {@Expose({ name: 'Token' }) // 支持JSON字段映射token: string = '';@Expose()Phone: string = '';@Expose()PostType: number = 0;// 嵌套对象处理@Expose()@Type(() => AllowOrgListModel) // 确保类型转换AllowOrgList?: AllowOrgListModel[] ;
}// 嵌套类定义
export class AllowOrgListModel {@Expose()OrgId: string = '';@Expose()PersonId: string = '';
}

3.使用示例‌

let par = {'Phone':this.userPhone, 'Password': this.password} as Record<string, number | String>;
httpReq.post<HttpResponseData>('/Person/Login', par).then(resData => {if (resData.Code == 200) {const userModel1 = plainToClass(MFUserModel, resData.RetData); // objectconst jsonStr = userModel.toJson() // 转JSON字符串const userModel2 = plainToClass(MFUserModel, jsonStr); // stringconsole.log('JSONString:', jsonStr);} else {Toast.show(resData.Msg)}
}).catch((error: Error) => {ConsoleLog.error('登录失败:', error.message);Toast.show(error.message)
});

相关文章:

  • OpenCV CUDA模块图像过滤------用于创建一个最小值盒式滤波器(Minimum Box Filter)函数createBoxMinFilter()
  • 第三十二天打卡
  • FFmpeg 超级详细安装与配置教程(Windows 系统)
  • 高等数学-积分
  • Ubuntu18.04安装ros
  • PG Craft靶机复现 宏macro攻击
  • flask允许跨域访问如何设置
  • Android 内存溢出(OOM)的 Kotlin 排查与优化指南
  • 【Java多态】:灵活编程的核心
  • 当AI遇上科研:北大“科学导航”重塑学术探索全流程
  • 数智读书笔记系列034《最优解人生》对编程群体的理念契合
  • 养生攻略:五步打造健康生活
  • 深度学习模型部署:使用Flask将图像分类(5类)模型部署在服务器上,然后在本地GUI调用。(全网模型部署项目步骤详解:从模型训练到部署再到调用)
  • 【缓存】JAVA本地缓存推荐Caffeine和Guava
  • 湖北理元理律师事务所:专业债务优化如何助力负债者重获生活掌控权
  • Java 大视界 -- Java 大数据机器学习模型在金融客户生命周期价值预测与营销策略制定中的应用(262)
  • HarmonyOS 鸿蒙应用开发基础:EventHub,优雅解决跨组件通信难题
  • 微信小程序学习基础:从入门到精通
  • 基于Scikit-learn与Flask的医疗AI糖尿病预测系统开发实战
  • LeetCode 滑动窗口问题 - 核心限制条件总结 (基于灵茶山艾府分类 - 详尽版)
  • 深圳网站建设培训/拼多多商品关键词搜索排名
  • 帮别人做网站的公司/宁波seo优化费用
  • 济宁做网站多少钱/信息流优化师是干什么的
  • 西安市高新区建设规划局网站/免费二级域名分发
  • 郑州专业做网站/百度投诉中心电话24个小时
  • 网站框架设计图/网络推广团队