Spring MVC集成FastJson及注解和序列化使用

fastjson 相比默认的jackson效率更好,在一些复杂的json结构中更容易操作。

配置fastjson

环境是spring 4.3,在springmvc.xml配置文件的注解驱动里面添加如下配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<!-- 注解驱动 -->
<mvc:annotation-driven>
<!-- HTML 消息转换 utf-8 -->
<mvc:message-converters register-defaults="true">
<bean
class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<!-- 注意顺序,先text,不然会出现下载 -->
<value>text/plain;charset=UTF-8</value>
<value>text/html;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
<value>application/xml;charset=UTF-8</value>
</list>
</property>
<!-- 字段空值默认不输出,配置序列化属性将空值也输出 -->
<property name="features">
<list>
<value>WriteNullNumberAsZero</value>
<value>WriteNullStringAsEmpty</value>
<value>WriteNullBooleanAsFalse</value>
<value>WriteDateUseDateFormat</value>
<value>WriteNullListAsEmpty</value>
<value>WriteMapNullValue</value>
<value>WriteEnumUsingToString</value>
<value>QuoteFieldNames</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>

字段序列化

不参与序列化

  1. 给指定不参与序列化的字段添加 transient 属性—java特性。
  2. 给指定不参与序列化的字段添加 JSONField(serialize = false)注解—fastjson特性。

@JSONType

@JSONType作用在类上。

  1. @JSONType(ignores={"account","phoneNum"})
    忽略此两个字段,不参与序列化。花括号里面是个数组。
  2. @JSONType(includes={"account","phoneNum"})
    只序列化这两个字段。

@JSONField

@JSONField作用在属性字段或get/set方法上。

  1. @JSONField(serialize = false)
    序列化,作用在属性字段上,等于false不参于序列化,默认是true
  2. @JSONField(deserialize = false)
    反序列化,注解在对象属性字段上,等于false不参与反序列化。
  3. @JSONField(name = nick_name)
    • 作用在属性字段上,序列化时重置属性字段的名称,如:nickName字段,加上注解序列化后显示nick_name
    • 作用在字段的get/set方法上。
  4. @JSONField(format = "yyyy-MM-dd HH:mm:ss")
    • 作用在属性字段上,格式化日期。
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      //属性字段
      private String account;
      @JSONField(serialize = false)
      private String password;//不参于序列化
      private transient String phoneNum;//不参于序列化
      @JSONField(name = "nick_name")
      private String nickName;//序列化重置属性名称
      private int age;
      private String address;

      /**bean 转json 时会把bean中的 nickName 转换为 nick_name */
      @JSONField(name="nick_name")
      public String getNickName() {
      return nickName;
      }

      /**json 转bean 时会把json中的 nick_name 值赋值给 nickName*/
      @JSONField(name="nick_name")
      public void setNickName(String nickName) {
      this.nickName = nickName;
      }

      上面内容是SpringMVC集成FastJson后,在Controller通过@ResponseBody来实现JSON自动转换。

手动序列化

本节内容是在代码层调用JSON方法来实现序列化或json格式化。

  1. 对象(Object)转 JSON字符串(String)。
    JSON.toJSONString(Object object);
    //fastjson 默认会过滤掉空值的字段,通过配置序列化属性可将空值字段也输出,序列化属性可配置多个。
    JSON.toJSONString(Object object, SerializerFeature... features);
1
2
3
4
5
//示例
String jsonSysUser = JSON.toJSONString(sysUser);
String jsonSysUserList = JSON.toJSONString(sysUserList,
SerializerFeature.WriteNullStringAsEmpty,
SerializerFeature.WriteNullNumberAsZero);
  1. JSON字符串(String)转对象(Object)
    JSON.parseObject(String text);
    JSON.parseObject(String text, Class clazz);
1
2
3
//示例
SysUser sysUser = JSON.parseObject(jsonSysUser, SysUser.class);
ArrayList<SysUser> sysUserList = JSON.parseObject(jsonSysUserList, ArrayList.class);
  1. 对象(Object)转JSON对象(JSON)
    JSON.toJSON(Object javaObject);
1
2
//示例
Object jsonData = JSON.toJSON(data);

序列化属性

  Fastjson 在序列化时,默认会过滤掉空值的属性字段(不参与序列化,不输出),可添加以下 SerializerFeature 序列化属性来满足需要:

  1. WriteNullNumberAsZero—-数值字段如果为null,输出为0,而非null
  2. WriteNullStringAsEmpty—字符类型字段如果为null,输出为”“,而非null
  3. WriteNullBooleanAsFalse–Boolean字段如果为null,输出为false,而非null
  4. WriteDateUseDateFormat——Date的日期转换器
  5. QuoteFieldNames———-输出key时是否使用双引号,默认为true
  6. WriteNullListAsEmpty—–List字段如果为null,输出为[],而非null
  7. WriteMapNullValue——–是否输出值为null的字段,默认为false
  8. WriteEnumUsingToString——枚举类型转为String

Fastjson序列化的枚举类:com.alibaba.fastjson.serializer.SerializerFeature

参考:Fastjson、Jackson与SpringMVC整合的MessageConverter配置
参考:fastjson:SerializerFeature属性使用
参考: fastjson SerializerFeature详解

Spring MVC集成FastJson及注解和序列化使用

http://blog.gxitsky.com/2018/01/19/SpringMVC-08-fastJSON/

作者

光星

发布于

2018-01-19

更新于

2022-06-17

许可协议

评论