欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > IT业 > 鸿蒙开发5.0【class-transformer的对象与JSON相互转换】

鸿蒙开发5.0【class-transformer的对象与JSON相互转换】

2024/10/23 20:34:08 来源:https://blog.csdn.net/2301_76813281/article/details/142108391  浏览:    关键词:鸿蒙开发5.0【class-transformer的对象与JSON相互转换】

场景一:方法将普通javascript对象转换为特定类的实例

解决方案

首先我们先定义一个想要指定的特定的类如下:

User里面包含属性id,fistname,lastname,age,data和它的构造方法,还有特定的方法getName和isAdult。

class User {id: number;firstName: string;lastName: string;age: number;date?: Date;​constructor() {this.id = 0;this.firstName = "";this.lastName = "";this.age = 0;}​getName() {return this.firstName + ' ' + this.lastName;}​isAdult() {return this.age > 18 && this.age < 60;}
}​

我们在前端处理后端传送过来的数据时,经过反序列化转换的对象全是plain(literal) object(普通(字面量)对象),如下,这里我们手动写一个待转换成特定对象的 JavaScript对象(JSON形式)。

interface UserJson {id: number,firstName: string,lastName: string,age: number,date?: Date
}
​
const userJson:UserJson = {id: 1,firstName: "Johny",lastName: "Cage",age: 27,date: new Date()
}

使用class-transform可以直接将收到的userJson字面量对象转换为User实例对象,进而可以使用其中的方法。

使用plainToInstance(将字面量转为类实例,支持数组转换)这个接口来进行转化对应实例。

plainToInstance第一个参数传入特定的实体类,第二个传入需要转换的js对象。

export function test1() {// JSON转为对象const user: User = plainToInstance(User,userJson);log("JSON转对象后输出情况");//输出class中的方法log(user.getName());log(user.isAdult() + "");
}

实现效果:

1

在项目中使用class-transformer例子

上面已经说明了class-transformer的最简单用法,现在说一个示例如何在项目中使用。

前端代码:

class User {//实体类还是我们刚才的实体User(包含fistname,lastname,age,data,和它的构造方法还有特定的方法getName和isAdult) 这里省略重复代码
}
​
Request.get({baseURL: 'http://xxxxx'
}).then((user: User) => {console.log(user)console.log(user.username)console.log(user.getName())console.log(user.isAdult())
})

后端代码:

@Get('/user')
findUser() {const user = new User('coder', '12345', 18);return user;
}

可以发现立马就报错了:

2

所以我们需要使用class-transformer的plainToInstance来做修改:

Request.get ({baseURL : 'http://xxx'}).then((user : User) => {const user1 = plainToInstance(User, user)console.log(user1.username)console.log(user1.getName())console.log(user1.isAdult())
})

立马见效,并且还能调用其中的方法:

3

场景二:JSON转对象的时候,控制某些敏感字段不对外暴露

解决方案

使用exclude注解可以解决,还是使用User实体来做演示里面的password属性不想被传到JSON。

class User {id: number;@Exclude()password: string;​constructor(id: number, password: string) {this.id = id;this.password = password;}
}

手动写一个待转换成特定对象的 javascript对象(JSON形式)。

interface UserJson {'id': number,'password': string
}

如果是传入的字符串我们需要搭配JSON.parse来使用,将字符串转化成JSON格式的UserJson对象,使用plainToInstance来进行转换,由于使用了@Exclude()注解

转换成user对象后password属性也不会被输出。

export function SensitiveJsonToInstanceDemo() {log('JSON转对象后输出情况');let ss = '{"id":1,"password":"123456"}'let oo: UserJson = JSON.parse(ss)let user: User = plainToInstance(User,oo)log('user_id=' + user.id)log('user_password=' + user.password);
}

可见需要控制隐藏的password并不会被输出。

4

场景三:属性是一些复杂结构体时,实现json与对象的互转

解决方案

这里我们定义一个需要转换的User实体类,user的id,name 还有firstSonName,firstSonAge。

class User {userId: number;userName: string;firstSonName: string;firstSonAge: number;​constructor(userId: number, userName: string, firstSonName: string, firstSonAge: number) {this.userId = userId;this.userName = userName;this.firstSonName = firstSonName;this.firstSonAge = firstSonAge;}
}

服务端传一个字符串。

{'userId': 1,'userName': 'abc','children': [{'username': 'son1','age': '18'},{'username': 'son2','age': '28'}]
}

所以我们设计两个接口:

interface UserJson {userId: number;userName: string;firstSonName: string;firstSonAge: number;
}
​
interface FatherJson {userId: number;userName: string;children: Record<string,string>[]
}

直接使用plainToInstance将fatherjson转换成user对象是获取不到firstSonName,与firstSonAge的属性的,所以我们需要进行一个属性拍平。

export function ComplexJsonToInstanceDemo() {//服务器返回的字符串let ss = '{"userId":1,"userName":"abc","children":[{"username":"son1","age":"18"},{"username":"son2","age":"28"}]}'//将字符串转化成JSONlet fatherjson: FatherJson = JSON.parse(ss)let fs: Record<string,string> = fatherjson.children[0]​//fatherjson转userjsonlet userjson: UserJson = {userId: fatherjson.userId,userName: fatherjson.userName,firstSonName: fs['username'],firstSonAge: parseInt(fs['age'])}​let user: User = plainToInstance(User,userjson)log('user_firstSonName=' + user.firstSonName)log('user_firstSonAge=' + user.firstSonAge)
}

实现效果,可看到firstSonName与firstSonAge,已经成功获取。

5

总结

使用三方库class-transformer搭配JSON的JSON.parse,可以满足类似gson/fastjson绝大部分的需求。

此外,建议审视设计的类和json是否合理,尽量避免使用复杂的转换。

以上就是本篇文章所带来的鸿蒙开发中一小部分技术讲解;想要学习完整的鸿蒙全栈技术。可以在结尾找我可全部拿到!
下面是鸿蒙的完整学习路线,展示如下:
1

除此之外,根据这个学习鸿蒙全栈学习路线,也附带一整套完整的学习【文档+视频】,内容包含如下

内容包含了:(ArkTS、ArkUI、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、鸿蒙南向开发、鸿蒙项目实战)等技术知识点。帮助大家在学习鸿蒙路上快速成长!

鸿蒙【北向应用开发+南向系统层开发】文档

鸿蒙【基础+实战项目】视频

鸿蒙面经

2

为了避免大家在学习过程中产生更多的时间成本,对比我把以上内容全部放在了↓↓↓想要的可以自拿喔!谢谢大家观看!
3

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com