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代替实体类进行序列化
  • 对于从叶节点一直搜索到根节点,并对同一父节点进行合并的问题
  1. 如果没有循环的父节点,例如system上面还是system,直接一个map缓存判断是否存在就可以
  2. 对于有循环父节点的,首先递归调用从该节点找到根节点(isRoot=1),如果发现节点A已经在缓存中,将节点A更新到父节点B,并将缓存更新至map
  3. 一旦节点B需要更新,那么B的所有父节点都要更新,也就是调用另外一个updateParent()递归
posted on 2020-08-18 00:20  Dr森  阅读(346)  评论(0)    收藏  举报