前言
開發(fā)中使用fastjson
調(diào)用toJSONString()
方法進(jìn)行序列化時,經(jīng)常會遇到根據(jù)需求需要過濾掉一些不需要的屬性字段,那么使用fastjson
如何來實(shí)現(xiàn)呢?這里來給大家簡單講解一下使用fastjson
序列化時過濾屬性字段的幾種方法及使用注意。
方法介紹
方法一、fastjson的注解
fastjson
中有個注解@JSONField(serialize = false)
可以在使用fastjson
進(jìn)行序列化時來過濾屬性字段,具體用法是直接在實(shí)體類需要過濾的屬性字段上方添加該注解即可,如下:
@JSONField(serialize = false)
private String password;
該方法是最便捷,如果需求是所有用到的地方都需要過濾該字段,那么可以說這是最好的解決方法。但可能有些需求并不是所有用到的地方都需要過濾該字段,還有些用到的地方可能還不能過濾掉,這樣的話就不太適合使用該方法了。
方法二、Java關(guān)鍵字
其實(shí)Java自帶的有一個屬性關(guān)鍵字transient
是忽略序列化的,如下:
private transient String password;
使用該關(guān)鍵字進(jìn)行修飾的字段是不參與序列化的,所以在使用fastjson
轉(zhuǎn)JSON
字符串時就可以忽略掉該字段。但是因?yàn)槭?code>Java關(guān)鍵字是忽略所有的序列化的,所以也會影響該字段其他的序列化操作,如果會用到其他的序列化操作并且不需要忽略該字段的話,建議使用方法一。如果只有fastjson
的轉(zhuǎn)JSON
字符串操作需要忽略,使用該方法也挺合適的。
方法三、fastjson的屬性名過濾器
fastjson
的toJSONString()
方法其實(shí)除了傳入實(shí)體類,還可以傳入一個過濾器的參數(shù),同時fastjson也提供了過濾器的實(shí)現(xiàn)類,如下:
SimplePropertyPreFilter filter = new SimplePropertyPreFilter();
filter.getExcludes().add("id");
filter.getExcludes().add("password");
System.out.println(JSON.toJSONString(user, filter));
這個方法可以過濾掉屬性字段id
和password
,這里使用JSON.toJSONString(user, filter)
其實(shí)還有一點(diǎn)小問題,就是這個方法是默認(rèn)過濾忽略掉值為null
的屬性字段的。要解決這個問題就需要換個方法,fastjson
還提供了另外的方法如下:
public static String toJSONString(Object object, SerializeFilter[] filters, SerializerFeature... features)
這個方法需要傳入的過濾器是一個數(shù)組和fastjson
定義的屬性特性的枚舉features
,上邊的代碼可以修改一下即可,如下:
SimplePropertyPreFilter filter = new SimplePropertyPreFilter();
filter.getExcludes().add("id");
filter.getExcludes().add("password");
SerializeFilter[] filters = {filter};
System.out.println(JSON.toJSONString(user, filters, SerializerFeature.WriteMapNullValue));
這里的SerializerFeature.WriteMapNullValue
就是設(shè)置在序列化時不忽略值為null
的屬性字段。
上邊的這種方法適合需要過濾的屬性字段比較少時候使用。
如果需要過濾掉的屬性字段比較多,而需要保留的屬性字段比較少,也可以反過來使用filter.getIncludes().add("name")
的方式來包含指定的字段,其他字段全部過濾掉。還可以直接在new
的時候帶上,這里是可變參數(shù),可以同時指定多個,如下:
SimplePropertyPreFilter filter = new SimplePropertyPreFilter("id", "name");
SerializeFilter[] filters = {filter};
System.out.println(JSON.toJSONString(user, filters, SerializerFeature.WriteMapNullValue));
這樣就是只序列化傳入的id
和name
了。
總結(jié):
以上三種方法都各有利弊。
方法一和方法二:最簡單便捷,但是使用不夠靈活,適用于一些固定的需求。
方法三:使用比較靈活,但是用起來會代碼比較繁瑣。
建議:
自定制JSONUtils
工具類將方法三進(jìn)行封裝成如下方法:
public static String toJSONString(Object object, String[] filterFields) {
if (filterFields != null && filterFields.length > 0) {
SimplePropertyPreFilter filter = new SimplePropertyPreFilter();
for (String field : filterFields) {
filter.getExcludes().add(field);
}
SerializeFilter[] filters = {filter};
return JSON.toJSONString(object, filters,
SerializerFeature.WriteMapNullValue);
}
return JSON.toJSONString(object,
SerializerFeature.WriteMapNullValue,
SerializerFeature.WriteNullListAsEmpty);
}
這樣在使用的時候就方便多了。這個封裝只是提供一個思路,實(shí)現(xiàn)的比較簡單,大家可以根據(jù)自己的需求來進(jìn)行相適應(yīng)的封裝。
最后,希望可以幫助到有需要的碼友。