Fastjson 序列化与反序列化

本文介绍 Fastjson 序列化与反序列化的几种实现方式。

Fastjson 序列化

Fastjson 支持多种方式定制序列化

  • 通过@JSONField定制序列化
  • 通过@JSONType定制序列化
  • 通过SerializeFilter定制序列化
  • 通过ParseProcess定制反序列化

1. 使用@JSONField配置

  • 可以将 @JSONField 配置在字段或者getter/setter方法上。例如:
    public class VO {
          @JSONField(name="ID")
          private int id;
     }
    
  • 或者
    public class VO {
          private int id;
          @JSONField(name="ID")
          public int getId() { return id;}
          @JSONField(name="ID")
          public void setId(int value) {this.id = id;}
     }
    

2. 使用@JSONType配置

和JSONField类似,但JSONType配置在类上,而不是field或者getter/setter方法上。

3. 通过SerializeFilter定制序列化

通过SerializeFilter可以使用扩展编程的方式实现定制序列化。fastjson提供了多种SerializeFilter:

  • PropertyPreFilter 根据PropertyName判断是否序列化
  • PropertyFilter 根据PropertyName和PropertyValue来判断是否序列化
  • NameFilter 修改Key,如果需要修改Key,process返回值则可
  • ValueFilter 修改Value
  • BeforeFilter 序列化时在最前添加内容
  • AfterFilter 序列化时在最后添加内容
SerializeFilter filter = ...; // 可以是上面5个SerializeFilter的任意一种。
  JSON.toJSONString(obj, filter);

4. 通过ParseProcess定制反序列化

定制反系列化API ParseProcess

Fastjson 反序列化

FastJson 提供了Spring MVC HttpMessageConverter的实现:

  • FastJsonHttpMessageConverter for Spring MVC Below 4.2
  • FastJsonHttpMessageConverter4 for Spring MVC 4.2+

可用于在Spring Controller中使用FastJson进行数据的Serialize and Deserialize。FastJsonConfig配置:

<bean id="fastJsonConfig" class="com.alibaba.fastjson.support.config.FastJsonConfig">    <!-- Default charset -->
    <property name="charset" value="UTF-8" />    <!-- Default dateFormat -->
    <property name="dateFormat" value="yyyy-MM-dd HH:mm:ss" />    <!-- Feature -->
    <property name="features">
        <list>
            <value>Your feature</value>
        </list>
    </property>    <!-- SerializerFeature -->
    <property name="serializerFeatures">
        <list>
            <value>Your serializer feature</value>
        </list>
    </property>    <!-- Global SerializeFilter -->
    <property name="serializeFilters">
        <list>
            <ref bean="Your serializer filter"/>    
        </list>
    </property>    <!-- Class Level SerializeFilter -->
    <property name="classSerializeFilters">
        <map>
            <entry key="Your filter class" value-ref="Your serializer filter"/>
        </map>
    </property>
</bean>

HttpMessageConverter配置

<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">            <!-- MediaTypes -->
            <property name="supportedMediaTypes">
                <list>
                    <value>application/json</value>
                </list>
            </property>            <!-- FastJsonConfig -->
            <property name="fastJsonConfig" ref="fastJsonConfig" />
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>
<mvc:default-servlet-handler />