fastjson使用toJSONString序列化過濾屬性字段詳解

image.png

前言

開發(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的屬性名過濾器

fastjsontoJSONString()方法其實(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));

這個方法可以過濾掉屬性字段idpassword,這里使用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));

這樣就是只序列化傳入的idname了。

總結(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)的封裝。

最后,希望可以幫助到有需要的碼友。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容