Fastjson的使用,以及项目中遇到的问题
Fastjson
- Fastjson是用来完成java对象和json相互转换的重要工具
- 在项目中的maven依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>x.x.x</version>
</dependency>
Fastjson的使用
-
基本的方法
toJSONString()完成对象转为JSON字符串
parseObject()完成JSON转换为Java对象 -
在实体类中
@JSONField(name= XXX)可以规定实体类属性转换后的key
@JSONField(name = "AGE")
private int age;
转换完后:
{"AGE":15}
-
在实体类中
@JSONField(name="AGE", serialize=false)通过serialize可以控制该属性要不要转换 -
在实体类中
@JSONField(name="AGE", ordinal = 1)可以控制序列化的顺序 -
在实体类中
@JSONField(name="DATE OF BIRTH", format="dd/MM/yyyy", ordinal = 3)可以格式化date属性 -
使用JSONArray可以创建出
"key":[{1},{2},{3}],在项目中用的比较多,如果传递subList,就用Array存储,使用add方法增加元素,remove删除元素 -
对于外键,Fastjson会把外键也实现并序列化,如果比较复杂,会出现Fastjson循环的Error
-
在Spring中,默认使用的是Jackson,在
controller中return给前端数据时,使用Jackson进行转换,即使在maven中引用了Fastjson,在return时也是使用Jackson. -
需要在application.java中进行配置才会使用Fastjson
@Bean public HttpMessageConverters fastJsonHttpMessageConverters(){ // 1.创建一个converter对象 FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter(); // 2.创建配置对象 FastJsonConfig fastJsonConfig = new FastJsonConfig(); // 3.添加配置 fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat); // 4.将配置添加到转换器对象中 fastConverter.setFastJsonConfig(fastJsonConfig); // 5. 解决中文乱码问题 List<MediaType> mediaTypes = new ArrayList<MediaType>(); mediaTypes.add(MediaType.APPLICATION_JSON_UTF8); fastConverter.setSupportedMediaTypes(mediaTypes); // 6.将转换器对象转化为HttpMessageConverter对象 HttpMessageConverter<?> converter = fastConverter; return new HttpMessageConverters(converter); }
项目中的使用
- 在传递数据时,对于树状结构,采用递归的方式一层层循环,对于多个子节点,使用JSONArray存储
- 一开始出现的序列循环错误,解决办法
1.使用Fastjson返回 2.同时使用@JSONField()隐藏不必要数据 3.使用DTO代替实体类进行序列化 - 对于从叶节点一直搜索到根节点,并对同一父节点进行合并的问题
- 如果没有循环的父节点,例如system上面还是system,直接一个map缓存判断是否存在就可以
- 对于有循环父节点的,首先递归调用从该节点找到根节点(isRoot=1),如果发现节点A已经在缓存中,将节点A更新到父节点B,并将缓存更新至map
- 一旦节点B需要更新,那么B的所有父节点都要更新,也就是调用另外一个updateParent()递归
浙公网安备 33010602011771号