https://blog.csdn.net/u011113654/article/details/50460787
使用fastjson進行序列化,就是把JavaBean轉換爲JSON格式的數據。
fastjson的序列化高度可控性,可以自己定製序列化。
fastjson的定製序列化有很多中實現方式,主要有如下的方式:
1.通過@JSONField定製序列化
2.通過@JSONType定製序列化
3.通過SerializeFilter定製序列化
下面依次講每一種方式的實現:
一、通過@JSONField定製序列化
在實體類上的字段,配置@JSONField。
- // 配置序列化的時候,不序列化id
- @JSONField(serialize=false)
- private int id;
- private String name; // 姓名
- private int age; // 年齡
- // 配置序列化的名稱
- @JSONField(name="gender")
- public String sex;
- // 序列化的時候, 不序列化id, sex字段序列化成gender
- User user = new User();
- user.setAge(10);
- user.setDate(new Date());
- user.setId(1);
- user.setName("李四");
- user.setSex("男");
- System.out.println("@JSONField --> " + JSON.toJSONString(user));
- /**
- * @ClassName: User
- * @Description: 測試用的實體類,
- * 使用ignores屬性配置序列化的時候,不序列化id字段
- * @author haoran.shu
- * @date 2015-12-30 下午5:24:23
- */
- @JSONType(ignores = {"id"})
- public class Uo implements Serializable {}
- /**
- * @ClassName: User
- * @Description: 測試用的實體類
- * 使用@JSONType配置只序列化name,sex字段
- * @author haoran.shu
- * @date 2015-12-30 下午5:24:23
- */
- @JSONType(includes={"name", "sex"})
- public class Uo1 implements Serializable {}
- //
- Uo uo = new Uo();
- uo.setAge(10);
- uo.setDate(new Date());
- uo.setId(1);
- uo.setName("李四");
- uo.setSex("男");
- System.out.println("@JSONType ignores --> " + JSON.toJSONString(uo));
- //
- Uo1 uo1 = new Uo1();
- uo1.setAge(10);
- uo1.setDate(new Date());
- uo1.setId(1);
- uo1.setName("李四");
- uo1.setSex("男");
- System.out.println("@JSONType includes --> " + JSON.toJSONString(uo1));
三、通過SerializeFilter定製序列化
通過SerializeFilter可以使用擴展編程的方式實現定製序列化。fastjson提供了多種SerializeFilter:
- PropertyPreFilter 根據PropertyName判斷是否序列化
- PropertyFilter 根據PropertyName和PropertyValue來判斷是否序列化
- NameFilter 修改Key,如果需要修改Key,process返回值則可
- ValueFilter 修改Value
- BeforeFilter 序列化時在最前添加內容
- AfterFilter 序列化時在最後添加內容
以上的SerializeFilter在JSON.toJSONString中可以使用。
- SerializeFilter filter = ...; // 可以是上面5個SerializeFilter的任意一種。
- JSON.toJSONString(obj, filter);
下面介紹每一種SerializeFilter的使用:
1.PropertyPreFilter
- /*
- * 定製序列化,只序列化一部分字段, 將需要序列化的字段名,配置到數組中
- * 如果什麼都不配置,則序列化全部字段
- */
- // 只序列化name
- SimplePropertyPreFilter filter = new SimplePropertyPreFilter(Group.class, new String[]{"name"});
- System.out.println("SimplePropertyPreFilter --> " + JSON.toJSONString(group, filter));
- // 根據key和value判斷是否需要序列化
- PropertyFilter filter2 = new PropertyFilter() {
- <span style="white-space:pre"> </span>/**
- <span style="white-space:pre"> </span>* source來源類,一般爲實體類
- <span style="white-space:pre"> </span>* 返回:
- <span style="white-space:pre"> </span>* true : 序列化
- <span style="white-space:pre"> </span>* false : 不序列化
- <span style="white-space:pre"> </span>*/
- <span style="white-space:pre"> </span>@Override
- public boolean apply(Object source, String key, Object value) {
- if(key.equals("id")){
- <span style="white-space:pre"> </span> if((int)value > 100){
- <span style="white-space:pre"> </span>return true;
- <span style="white-space:pre"> </span>}
- }else if(key.equals("name")){
- return true;
- }
- return false;
- }
- };
- System.out.println("PropertyFilter : " + JSON.toJSONString(group, filter2));
- // 序列化時修改key
- NameFilter nameFilter = new NameFilter() {
- /**
- * 如果需要修改Key,process返回值則可
- * 返回需要修改後的key值,如果不修改,則返回name
- * 切記不能返回null,否則會報錯
- */
- @Override
- public String process(Object object, String name, Object value) {
- if(name.equals("id")){
- return "ID";
- }
- return name;
- }
- };
- System.out.println("NameFilter : " + JSON.toJSONString(group, nameFilter));
4.ValueFilter
- // 序列化時修改value
- ValueFilter valueFilter = new ValueFilter() {
- @Override
- public Object process(Object object, String name, Object value) {
- if(name.equals("name")){
- return "張三";
- }
- return "";
- }
- };
- System.out.println("ValueFilter : " + JSON.toJSONString(group, valueFilter));
- // 序列化時在最前添加內容
- BeforeFilter beforeFilter = new BeforeFilter() {
- @Override
- public void writeBefore(Object object) {
- writeKeyValue("start", "bofore");
- writeKeyValue("start1", "bofore");
- }
- };
- System.out.println("BeforeFilter : " + JSON.toJSONString(group, beforeFilter));
- // 序列化之時在最後添加內容
- AfterFilter afterFilter = new AfterFilter() {
- @Override
- public void writeAfter(Object object) {
- writeKeyValue("end", "after");
- }
- };
- System.out.println("AfterFilter : " + JSON.toJSONString(group, afterFilter));