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

[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)
});

http://www.xdnf.cn/news/8133.html

相关文章:

  • embedding的微调
  • MYSQL order 、group 与row_number详解
  • 3452. 好数字之和
  • 通义灵码 2.5 版深度评测:智能编程的边界在哪里?
  • 在 Spring 管理的事务环境中,获取当前事务下的 JDBC Connection对象
  • 每日算法 -【Swift 算法】Z 字形变换(Zigzag Conversion)详解与实现
  • 【机器学习基础】机器学习入门核心算法:线性回归(Linear Regression)
  • 课外知识:Python方法绑定机制与装饰器传参详解 与 实战
  • 力扣HOT100之二叉树:105. 从前序与中序遍历序列构造二叉树
  • std::initialzer_list 与花括号{}数据列表
  • 实现一个前端动态模块组件(Vite+原生JS)
  • Springboot安全策略Spring Security
  • LeetCode Hot100(滑动窗口)
  • 手机打电话时由对方DTMF响应切换多级IVR语音菜单(话术脚本与实战)
  • 【Java多线程】JUC其他常用组件
  • (视觉)分类、检测与分割在不同网络中的设计体现
  • LeetCode 滑动窗口问题 - 核心限制条件总结 (基于灵茶山艾府分类 - 详尽版)
  • Java集合再探
  • Linux LVM管理
  • 整平机:工业制造中的关键设备
  • Linux 输出输入重定向、tee命令详解
  • 高等数学-极限
  • OceanBase数据库全面指南(函数篇)函数速查表
  • 区分:union(),coalesce () 和 repartition ()
  • ProtoBuffer在Android端的编译
  • 网络编程 之网络七层模型、TCPUDP协议、JAVA IO 发展历程
  • 【2025-05-22】centos 离线安装兼容node和npm版本的pm2 和 yarn
  • 2025软考高级信息系统项目管理师英文选择题---技术类常见英语词汇
  • python 绘制3D平面图
  • 【记录】PPT|PPT打开开发工具并支持Quicker VBA运行