自定義注解忽略Json字段(FastJson)

1. JSONFieldFilter

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

/**
 * Created by zxk175 on 17/5/20.
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface JSONFieldFilter {
    // 要處理的字段
    String[] fields();
}

2. FastJsonUtil

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.JSONLibDataFormatSerializer;
import com.alibaba.fastjson.serializer.SerializeConfig;
import com.alibaba.fastjson.serializer.SerializeFilter;
import com.alibaba.fastjson.serializer.SerializerFeature;

import java.util.List;
import java.util.Map;

/**
 * Created by zxk175 on 17/5/7.
 */
public class FastJsonUtil {
    private static final SerializeConfig config;

    static {
        config = new SerializeConfig();
        // 使用和json-lib兼容的日期輸出格式
        config.put(java.util.Date.class, new JSONLibDataFormatSerializer());
        // 使用和json-lib兼容的日期輸出格式
        config.put(java.sql.Date.class, new JSONLibDataFormatSerializer());
        // 修改全局的全局日期格式
        JSON.DEFFAULT_DATE_FORMAT = SystemConstant.DATE_FORMAT_DEFAULT;
    }

    private static final SerializerFeature[] features = {
            // 輸出key時是否使用雙引號,默認為true
            SerializerFeature.QuoteFieldNames,
            // 避免循環(huán)引用
            SerializerFeature.DisableCircularReferenceDetect,
            // 是否輸出值為null的字段
            SerializerFeature.WriteMapNullValue,
            // 數(shù)值字段如果為null,輸出為0,而非null
            SerializerFeature.WriteNullNumberAsZero,
            // 字符類型字段如果為null,輸出為"",而非null
            SerializerFeature.WriteNullStringAsEmpty,
            // list字段如果為null,輸出為[],而非null
            SerializerFeature.WriteNullListAsEmpty,
            // boolean字段如果為null,輸出為false,而非null
            SerializerFeature.WriteNullBooleanAsFalse,
            // 設置使用文本方式輸出日期,fastjson默認是long
            SerializerFeature.WriteDateUseDateFormat,
            // 兼容IE6 即不將中文轉為Unicode編碼
            //SerializerFeature.BrowserCompatible
    };

    /**
     * Object轉換為Json字符串, 使用默認配置
     *
     * @param object
     * @return
     */
    public static String toJSONNoFeatures(Object object) {
        return JSON.toJSONString(object, config, new FastJsonValueFilter());
    }

    /**
     * Object轉換為Json字符串兄猩,使用自定義配置
     *
     * @param object
     * @return
     */
    public static String toJSONString(Object object) {
        return JSON.toJSONString(object, config, new FastJsonValueFilter(), features);
    }

    /**
     * Object轉換為Json字符串培他,使用自定義配置
     *
     * @param object
     * @return
     */
    public static String toJSONString(Object object, SerializeFilter[] filters) {
        return JSON.toJSONString(object, config, filters, features);
    }

    /**
     * 轉換為Object
     *
     * @param text
     * @return
     */
    public static Object toBean(String text) {
        return JSON.parse(text);
    }

    /**
     * 轉換為指定Object
     *
     * @param text
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> T toBean(String text, Class<T> clazz) {
        return JSON.parseObject(text, clazz);
    }

    /**
     * 轉換為數(shù)組
     *
     * @param text
     * @param <T>
     * @return
     */
    public static <T> Object[] toArray(String text) {
        return toArray(text, null);
    }

    /**
     * 轉換為數(shù)組
     *
     * @param text
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> Object[] toArray(String text, Class<T> clazz) {
        return JSON.parseArray(text, clazz).toArray();
    }

    /**
     * 轉換為List
     *
     * @param text
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> List<T> toList(String text, Class<T> clazz) {
        return JSON.parseArray(text, clazz);
    }

    /**
     * javabean轉化為序列化的json字符串
     *
     * @param object
     * @return
     */
    public static Object beanToJson(Object object) {
        String textJson = JSON.toJSONString(object, new FastJsonValueFilter(), features);
        Object objectJson = JSON.parse(textJson);
        return objectJson;
    }

    /**
     * string轉化為序列化的json字符串
     *
     * @param text
     * @return
     */
    public static Object textToJson(String text) {
        Object objectJson = JSON.parse(text);
        return objectJson;
    }

    /**
     * json字符串轉化為map
     *
     * @param s
     * @return
     */
    public static Map stringToMap(String s) {
        Map m = JSONObject.parseObject(s);
        return m;
    }

    /**
     * map轉化為json字符串
     *
     * @param m
     * @return
     */
    public static String mapToString(Map m) {
        String s = JSONObject.toJSONString(m, new FastJsonValueFilter(), features);
        return s;
    }

    /**
     * 解析Json字符串
     *
     * @param jsonStr
     * @param key
     * @return
     */
    public static Object getJsonValueBykey(String jsonStr, String key) {
        JSONObject json = JSONObject.parseObject(jsonStr);
        return json.get(key);
    }
}

3. FastJsonValueFilter

import com.alibaba.fastjson.serializer.ValueFilter;
import com.xiaoleilu.hutool.convert.Convert;
import com.xiaoleilu.hutool.util.ObjectUtil;

/**
 * Created by zxk175 on 17/5/7.
 */
public class FastJsonValueFilter implements ValueFilter {
    /**
     * 值過濾器 處理函數(shù)
     *
     * @param object
     * @param name
     * @param value
     * @return
     */
    @Override
    public Object process(Object object, String name, Object value) {

        if (ObjectUtil.isNull(value) && ("data".equals(name) || "extra".equals(name))) {
            return new Object();
        }

        if (ObjectUtil.isNull(value)) {
            return "";
        }

        // 防止Long轉換為Json發(fā)生截斷
        if (value instanceof Long) {
            value = Convert.toStr(value);
        }

        return value;
    }
}

4. MethodReturnValueHandlerByJSON

import com.alibaba.fastjson.serializer.SerializeFilter;
import com.alibaba.fastjson.serializer.SimplePropertyPreFilter;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
import org.springframework.web.method.support.ModelAndViewContainer;

import javax.servlet.http.HttpServletResponse;
import java.lang.annotation.Annotation;
import java.util.Set;

/**
 * Created by zxk175 on 17/5/20.
 */
public class MethodReturnValueHandlerByJSON implements HandlerMethodReturnValueHandler {
    /**
     * 檢驗是否支持本處理器處理,返回true會執(zhí)行handleReturnValue方法
     *
     * @param returnType
     * @return
     */
    @Override
    public boolean supportsReturnType(MethodParameter returnType) {
        // 如果有自定義的JSONFieldFilter 注解 就用這個Handler 來處理
        return returnType.hasMethodAnnotation(JSONFieldFilter.class);
    }

    /**
     * 處理返回值的方法,returnValue即是controller方法中的返回值
     *
     * @param returnValue
     * @param returnType
     * @param mavContainer
     * @param webRequest
     * @throws Exception
     */
    @Override
    public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception {
        // 設置這個就是最終的處理類了模庐,處理完不再去找下一個類進行處理
        mavContainer.setRequestHandled(true);

        // 獲得Response對象
        HttpServletResponse response = webRequest.getNativeResponse(HttpServletResponse.class);
        response.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE);
        Annotation[] annotations = returnType.getMethodAnnotations();

        // 獲取JSONFieldFilter
        JSONFieldFilter jsonFieldFilter = null;
        for (Annotation annotation : annotations) {
            if (annotation instanceof JSONFieldFilter) {
                jsonFieldFilter = (JSONFieldFilter) annotation;
            }
        }

        // 值過濾器
        FastJsonValueFilter vf = new FastJsonValueFilter();
        // 屬性過濾器
        SimplePropertyPreFilter spp = new SimplePropertyPreFilter();
        // 要忽略屬性數(shù)組
        String[] fields = jsonFieldFilter.fields();
        int len = fields.length;
        // 添加忽略屬性
        if (len > 0) {
            Set<String> fieldSet = spp.getExcludes();
            for (int i = 0; i < len; i++) {
                fieldSet.add(fields[i]);
            }
        }
        // Json最大嵌套層級 --猜的
        spp.setMaxLevel(5);

        SerializeFilter[] filters = {vf, spp};

        String json = FastJsonUtil.toJSONString(returnValue, filters);
        response.getWriter().write(json);
    }
}

5. spring-mvc.xml

<mvc:annotation-driven>
    <!-- 方法返回值處理器配置 -->
    <mvc:return-value-handlers>
        <bean class="MethodReturnValueHandlerByJSON"/>
    </mvc:return-value-handlers>
</mvc:annotation-driven>

6. UserController

@JSONFieldFilter(fields = {
            "token", "createSource", "createTime",
            "updateTime", "status", "loginStatus",
            "verificationCode", "lastLoginTime", "lastLoginIp"
    })
    public ResponseVO userLoginV1(@PathVariable String mobile, @PathVariable String code, HttpServletRequest request) {
        return loginV1(mobile, code, request, true);
    }

7. 注意

使用了自定義注解就不能用@ResponseBody
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末杠氢,一起剝皮案震驚了整個濱河市些楣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌浪册,老刑警劉巖扫腺,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異村象,居然都是意外死亡笆环,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進店門厚者,熙熙樓的掌柜王于貴愁眉苦臉地迎上來躁劣,“玉大人,你說我怎么就攤上這事库菲≌送” “怎么了?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵蝙昙,是天一觀的道長闪萄。 經(jīng)常有香客問我,道長奇颠,這世上最難降的妖魔是什么败去? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮烈拒,結果婚禮上圆裕,老公的妹妹穿的比我還像新娘广鳍。我一直安慰自己,他們只是感情好吓妆,可當我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布赊时。 她就那樣靜靜地躺著,像睡著了一般行拢。 火紅的嫁衣襯著肌膚如雪祖秒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天舟奠,我揣著相機與錄音竭缝,去河邊找鬼。 笑死沼瘫,一個胖子當著我的面吹牛抬纸,可吹牛的內容都是我干的。 我是一名探鬼主播耿戚,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼湿故,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了膜蛔?” 一聲冷哼從身側響起坛猪,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎飞几,沒想到半個月后砚哆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡屑墨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年躁锁,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片卵史。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡战转,死狀恐怖,靈堂內的尸體忽然破棺而出以躯,到底是詐尸還是另有隱情槐秧,我是刑警寧澤,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布忧设,位于F島的核電站刁标,受9級特大地震影響,放射性物質發(fā)生泄漏址晕。R本人自食惡果不足惜膀懈,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谨垃。 院中可真熱鬧启搂,春花似錦硼控、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至疑苫,卻和暖如春熏版,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留游沿,地道東北人擎淤。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像饵史,于是被迫代替她去往敵國和親满钟。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,658評論 2 350

推薦閱讀更多精彩內容