fastJson 自定義注解和過濾器完成自定義序列化

場景

有時候我們在序列化的時候,做一些脫敏處理历筝,或者做一些類型的轉(zhuǎn)換,比如在java程序中使用的一些特殊的數(shù)據(jù)類型BigDecimal 在傳到前端的時候就在出現(xiàn)解析精度丟失的情況,因為js沒有合適的數(shù)據(jù)類型去接收這個數(shù)據(jù)類目养,所以采取的辦法就是序列化的時候直接把BigDecimal類型轉(zhuǎn)換成String
大概是這樣子

{
  "bigDecimal": "0.315675",
  "bigDecimal2": 0.316767,
  "d": 2222
}

前端在拿到 bigDecimal這個字段直接解析這個字符串顯示到界面,精度就不會丟失财异。

怎么達到這個效果

這里面就需要 實現(xiàn) ValueFilter 這個接口
首先要看 SerializeFilter這個接口是通過編程擴展的方式定制序列化倘零。
fastjson支持6種SerializeFilter,用于不同場景的定制序列化戳寸。

PropertyPreFilter 根據(jù)PropertyName判斷是否序列化 
PropertyFilter 根據(jù)PropertyName和PropertyValue來判斷是否序列化 
NameFilter 修改Key呈驶,如果需要修改Key,process返回值則可 
ValueFilter 修改Value 
BeforeFilter 序列化時在最前添加內(nèi)容 
AfterFilter 序列化時在最后添加內(nèi)容

我們實現(xiàn)的是 ValueFilter這個
具體看代碼解釋


public class BeanPropertyFilter implements ValueFilter {
    private Field field = null;
    @Override
    public Object process(Object obj, String name, Object value) {
        Boolean flag = false;
        try {
            field = obj.getClass().getDeclaredField(name);
            // 獲取注解
            flag = field.getAnnotation(FieldToString.class).value().equals("true");
            if (flag == true && value != null) {
                // 這里 其他類型轉(zhuǎn)換成String類型
                value += "";
            }
        } catch (NoSuchFieldException e) {
            return value;
        } catch (Exception e) {
            return value;
        }
        return value;
    }
}

現(xiàn)在需要在實現(xiàn)一個自定義的注解

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface FieldToString {
    public  String  value()  default "true";
}

注解類就不解釋了

如何使用

class D {
    @FieldToString
    private BigDecimal bigDecimal;
    private BigDecimal bigDecimal2;
    private double d;
   //此處省略 get set方法

測試下

public static void main(String[] args) { 
        BeanPropertyFilter beanPropertyFilter=new BeanPropertyFilter();
        D d=new D();
        d.setBigDecimal(new BigDecimal(0.315675).setScale(6,BigDecimal.ROUND_HALF_UP));
        d.setD(2222L);
        d.setBigDecimal2(new BigDecimal(0.316767).setScale(6,BigDecimal.ROUND_HALF_UP));
        System.out.println(JSON.toJSONString(d,beanPropertyFilter));
    }

這是序列化的之后的結果
可以看到在第一個 變量需要里面已經(jīng)轉(zhuǎn)成了String類型,然后其他的變量沒有被轉(zhuǎn)疫鹊,這就達到的預期效果了

{
  "bigDecimal": "0.315675",
  "bigDecimal2": 0.316767,
  "d": 2222
}

效率上怎么樣

在效率上自定義的過濾器中大概測試了一下袖瞻,在循環(huán)十萬次測試,使用自定義序列化和不使用僅僅相差1秒鐘拆吆,完全可以忽略聋迎。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市枣耀,隨后出現(xiàn)的幾起案子霉晕,更是在濱河造成了極大的恐慌,老刑警劉巖捞奕,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件牺堰,死亡現(xiàn)場離奇詭異,居然都是意外死亡颅围,警方通過查閱死者的電腦和手機伟葫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來院促,“玉大人扒俯,你說我怎么就攤上這事∫环瑁” “怎么了撼玄?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長墩邀。 經(jīng)常有香客問我掌猛,道長,這世上最難降的妖魔是什么眉睹? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任荔茬,我火速辦了婚禮,結果婚禮上竹海,老公的妹妹穿的比我還像新娘慕蔚。我一直安慰自己,他們只是感情好斋配,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布孔飒。 她就那樣靜靜地躺著灌闺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪坏瞄。 梳的紋絲不亂的頭發(fā)上桂对,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天,我揣著相機與錄音鸠匀,去河邊找鬼蕉斜。 笑死,一個胖子當著我的面吹牛缀棍,可吹牛的內(nèi)容都是我干的宅此。 我是一名探鬼主播,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼爬范,長吁一口氣:“原來是場噩夢啊……” “哼诽凌!你這毒婦竟也來了?” 一聲冷哼從身側響起坦敌,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎痢法,沒想到半個月后狱窘,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡财搁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年蘸炸,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尖奔。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡搭儒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出提茁,到底是詐尸還是另有隱情淹禾,我是刑警寧澤,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布茴扁,位于F島的核電站铃岔,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏峭火。R本人自食惡果不足惜毁习,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望卖丸。 院中可真熱鬧纺且,春花似錦、人聲如沸稍浆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至恐仑,卻和暖如春泉坐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背裳仆。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工腕让, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人歧斟。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓纯丸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親静袖。 傳聞我的和親對象是個殘疾皇子觉鼻,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359

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

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)队橙,斷路器坠陈,智...
    卡卡羅2017閱讀 134,704評論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,859評論 6 342
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,303評論 25 707
  • 《道德經(jīng)》第54一55章 老子道德經(jīng)第五十五章原文及譯文
    甜蜜荔枝閱讀 159評論 0 8
  • 隨著引力波被LIGO的成功探測解总,量子物理贮匕,這個在物理史上不斷挑戰(zhàn)人類認知的學科,又一次被推上輿論頂峰花枫。量子物理的發(fā)...
    Jenny喬閱讀 1,109評論 13 17