SpringMVC(八):集成FastJson及注解和序列化使用

star2017 1年前 ⋅ 314 阅读

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

配置fastjson

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

<!-- 注解驱动 -->
<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")

    • 作用在属性字段上,格式化日期。

      //属性字段
      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);

    //示例
    String jsonSysUser = JSON.toJSONString(sysUser);
    String jsonSysUserList = JSON.toJSONString(sysUserList, 
                   SerializerFeature.WriteNullStringAsEmpty,
                   SerializerFeature.WriteNullNumberAsZero);
    
  2. JSON字符串(String)转对象(Object)
    JSON.parseObject(String text);
    JSON.parseObject(String text, Class clazz);

    //示例
    SysUser sysUser = JSON.parseObject(jsonSysUser, SysUser.class);
    ArrayList<SysUser> sysUserList = JSON.parseObject(jsonSysUserList, ArrayList.class);
    
  3. 对象(Object)转JSON对象(JSON)
    JSON.toJSON(Object javaObject);

    //示例
    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

参考资料

  1. Fastjson、Jackson与SpringMVC整合的MessageConverter配置
  2. fastjson:SerializerFeature属性使用
  3. fastjson SerializerFeature详解
更多内容请访问:IT源点

相关文章推荐

全部评论: 0

    我有话说: