需求:在实际业务中,有时需要针对某些特殊的实体对象进行定制的转JSON方式,它是局部的,比方说序列化Map对象时,比方说某些枚举需要转换为特殊的字符串时。
概述: FastJson2提供了基础的序列化器与反序列化器,包括枚举与类对象,提供了基础的处理方式。在执行转换时注册并触发。
目录
Java对象转JSON
-
自定义序列化器
基础类:
示例:
默认情况下,序列化结果如下
FastJson2包下有接口ObjectWriter ,通过实现该接口自定义序列化器,如下:
大致步骤分为
1.自定义序列化器
2.创建WriteContext并注册自定义序列化器
3.执行序列化时带上WriteContext对象作为参数。
这里需要注意的事,注册序列化器时,有2个参数,一个是Type,也就是类的class,一个是序列化器对象。这里的意思是,当执行序列化的过程中,需要处理指定类型的值时,触发该序列化器,比如图中指定Long类型,那么只对于Long类型的值转换时会触发,对于其他类型的值,比如Integer类型就没有触发。该序列化器是针对类型的,也就是当序列化的对象有多个符合条件的类型值时,会触发多次。
序列化过滤器
FastJson2提供了几个标准的过滤器接口,通过自定义不同的过滤器,并在序列化时触发实现业务需求。
* 序列化时有以下几种过滤器 同类型过滤器只能注册一个
* PropertyPreFilter 根据PropertyName判断是否序列化
* PropertyFilter 根据PropertyName和PropertyValue来判断是否序列化
* NameFilter 修改Key,如果需要修改Key,process返回值则可
* ValueFilter 修改Value
* BeforeFilter 序列化时在最前添加内容
* AfterFilter 序列化时在最后添加内容
示例:
调用JSON.toJSONString提供的重载方法,可以快速注册自定义过滤器。同类型过滤器,只会存在一个,可以看到我声明了两个ValueFilter,一个NameFilter
不同的过滤器,触发机制也不同,像ValueFilter与NameFilter,会针对每个序列化的属性,都触发。当然,这些过滤器链是有顺序的,感兴趣可以自己测试一下。
这里的枚举,转换成了字符,并不像之前的序列化结果,是一个下标值。
那是因为Feature,是FastJson2提供的标准的“特性”标签,可以有多个,
比如这里使用的JSONWriter.Feature.WriteEnumsUsingName,大致意思就是枚举取枚举名(默认取下标),对这次序列化的所有枚举都生效。
序列化器与序列化过滤器可以一起使用
反序列化
反序列化的过程大致为两个,一是属性名的匹配映射,二是值的类型转换
这里在name属性名相同的情况下,直接进入value的类型转换
与序列化相同,fastJson2提供了基础的反序列化器,也可以自定义反序列化器,并注册指定类型触发。
示例:
先创建两个反序列化器
注册指定类型
以上的规则都是局部的,因为参数传递,所以生效。对全局是没有影响的。