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>
字段序列化
不参与序列化
- 给指定不参与序列化的字段添加
transient
属性---java特性。 - 给指定不参与序列化的字段添加
JSONField(serialize = false)
注解---fastjson特性。
@JSONType
@JSONType
作用在类上。
@JSONType(ignores={"account","phoneNum"})
忽略此两个字段,不参与序列化。花括号里面是个数组。@JSONType(includes={"account","phoneNum"})
只序列化这两个字段。
@JSONField
@JSONField
作用在属性字段或get/set
方法上。
@JSONField(serialize = false)
序列化,作用在属性字段上,等于false
不参于序列化,默认是true
。@JSONField(deserialize = false)
反序列化,注解在对象属性字段上,等于false
不参与反序列化。@JSONField(name = nick_name)
- 作用在属性字段上,序列化时重置属性字段的名称,如:nickName字段,加上注解序列化后显示nick_name。
- 作用在字段的
get/set
方法上。
@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格式化。
对象(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);
JSON字符串(String)转对象(Object)
JSON.parseObject(String text);
JSON.parseObject(String text, Classclazz); //示例 SysUser sysUser = JSON.parseObject(jsonSysUser, SysUser.class); ArrayList<SysUser> sysUserList = JSON.parseObject(jsonSysUserList, ArrayList.class);
对象(Object)转JSON对象(JSON)
JSON.toJSON(Object javaObject);
//示例 Object jsonData = JSON.toJSON(data);
序列化属性
Fastjson 在序列化时,默认会过滤掉空值的属性字段(不参与序列化,不输出),可添加以下 SerializerFeature
序列化属性来满足需要:
- WriteNullNumberAsZero—-数值字段如果为null,输出为0,而非null
- WriteNullStringAsEmpty—字符类型字段如果为null,输出为”“,而非null
- WriteNullBooleanAsFalse–Boolean字段如果为null,输出为false,而非null
- WriteDateUseDateFormat——Date的日期转换器
- QuoteFieldNames———-输出key时是否使用双引号,默认为true
- WriteNullListAsEmpty—–List字段如果为null,输出为[],而非null
- WriteMapNullValue——–是否输出值为null的字段,默认为false
- WriteEnumUsingToString——枚举类型转为String
Fastjson序列化的枚举类:com.alibaba.fastjson.serializer.SerializerFeature
。
参考资料
注意:本文归作者所有,未经作者允许,不得转载