
基于class-transformer的对象与JSON相互转换
场景一:方法将普通javascript对象转换为特定类的实例
解决方案
首先我们先定义一个想要指定的特定的类如下:
User里面包含属性id,fistname,lastname,age,data和它的构造方法,还有特定的方法getName和isAdult。
我们在前端处理后端传送过来的数据时,经过反序列化转换的对象全是plain(literal) object(普通(字面量)对象),如下,这里我们手动写一个待转换成特定对象的 JavaScript对象(JSON形式)。
使用class-transform可以直接将收到的userJson字面量对象转换为User实例对象,进而可以使用其中的方法。
使用plainToInstance(将字面量转为类实例,支持数组转换)这个接口来进行转化对应实例。
plainToInstance第一个参数传入特定的实体类,第二个传入需要转换的js对象。
实现效果:
在项目中使用class-transformer例子
上面已经说明了class-transformer的最简单用法,现在说一个示例如何在项目中使用。
前端代码:
后端代码:
可以发现立马就报错了:
所以我们需要使用class-transformer的plainToInstance来做修改:
立马见效,并且还能调用其中的方法:
场景二:JSON转对象的时候,控制某些敏感字段不对外暴露
解决方案
使用exclude注解可以解决,还是使用User实体来做演示里面的password属性不想被传到JSON。
手动写一个待转换成特定对象的 javascript对象(JSON形式)。
如果是传入的字符串我们需要搭配JSON.parse来使用,将字符串转化成JSON格式的UserJson对象,使用plainToInstance来进行转换,由于使用了@Exclude()注解
转换成user对象后password属性也不会被输出。
可见需要控制隐藏的password并不会被输出。
场景三:属性是一些复杂结构体时,实现json与对象的互转
解决方案
这里我们定义一个需要转换的User实体类,user的id,name 还有firstSonName,firstSonAge。
服务端传一个字符串。
所以我们设计两个接口:
直接使用plainToInstance将fatherjson转换成user对象是获取不到firstSonName,与firstSonAge的属性的,所以我们需要进行一个属性拍平。
实现效果,可看到firstSonName与firstSonAge,已经成功获取。
总结
使用三方库class-transformer搭配JSON的JSON.parse,可以满足类似gson/fastjson绝大部分的需求,更多用法可以参考https://github.com/typestack/class-transformer文档。
此外,建议审视设计的类和json是否合理,尽量避免使用复杂的转换。
