jackson序列化,指定属性筛选

package com.sankuai.mall.sqm.api.web.controller.tool;

import com.fasterxml.jackson.annotation.JsonFilter;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.BeanPropertyWriter;
import com.fasterxml.jackson.databind.ser.PropertyWriter;
import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter;
import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import org.apache.thrift.TBase;
import java.util.Collections;
import java.util.HashSet;

import java.util.Set;

public class CustomObjectMapper extends ObjectMapper {
    static final String DYNC_FILTER = "DYNC_FILTER";
    static final String Customer_DYNC_FILTER = "Customer_DYNC_FILTER";
    @JsonFilter(DYNC_FILTER)
    interface DynamicFilter {
    }
    @JsonFilter(Customer_DYNC_FILTER)
    interface CustomerDynamicFilter {
    }
    private void registerCustomerModule() {
        // 序列换成json时,将所有的long变成string,因为js中得数字类型不能包含所有的java long值
        SimpleModule simpleModule = new SimpleModule();
        simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
        simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
        registerModule(simpleModule);
        registerModule(new CustomEnumModule());
    }
    private void setCustomerFilterProvider(){
        //排除thrift实体自动生成的属性
        //以set开头
        Set<String> prffixProperties=new HashSet<>();
        prffixProperties.add("setSet");
        //以Iterator结尾
        Set<String> suffixProperties=new HashSet<>();
        suffixProperties.add("Iterator");
        SimpleBeanPropertyFilter theFilter = new SerializeExceptFilter(null,prffixProperties,suffixProperties,null);
        SimpleFilterProvider filter = new SimpleFilterProvider();
        filter.addFilter(DYNC_FILTER, theFilter);

//        //如果thrift实体中的属性名称本身以set开头
//        Set<String> customerPrffixProperties=new HashSet<>();
//        customerPrffixProperties.add("setSet");
//        SimpleBeanPropertyFilter customerFilter = new SerializeExceptFilter(null,customerPrffixProperties,suffixProperties,null);
//        filter.addFilter(Customer_DYNC_FILTER, customerFilter);

        setFilterProvider(filter);
        //setFilterProvider方法表示添加了一个filter,只对添加了@JsonFilter(DYNC_FILTER)的class生效
        //可以通过addMixIn,给指定的class生效特定的filter
        //所有类都生效这个filter
        //addMixIn(Object.class, DynamicFilter.class);
        addMixIn(TBase.class, DynamicFilter.class);
        //需要特殊处理的thrift类
        //addMixIn(ApiZZZZResponse.class, CustomerDynamicFilter.class);
    }
    public CustomObjectMapper() {
        disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
        // 设置日期转换yyyy-MM-dd HH:mm:ss
        //setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
        registerCustomerModule();
        setCustomerFilterProvider();
    }
    public class SerializeExceptFilter
            extends SimpleBeanPropertyFilter
            implements java.io.Serializable
    {
        private static final long serialVersionUID = 1L;
        /**
         * Set of property names to filter out.
         */
        protected final Set<String> _propertiesToExclude;

        /**
         * 前缀
         */
        protected final Set<String> _prffixPropertiesToExclude;
        /**
         * 后缀
         */
        protected final Set<String> _suffixPropertiesToExclude;

        /**
         * 包含
         */
        protected final Set<String> _contansPropertiesToExclude;

        SerializeExceptFilter() {
            _propertiesToExclude = Collections.emptySet();
            _prffixPropertiesToExclude = Collections.emptySet();
            _suffixPropertiesToExclude = Collections.emptySet();
            _contansPropertiesToExclude = Collections.emptySet();
        }

        public SerializeExceptFilter(Set<String> properties,Set<String> prffixProperties,Set<String> suffixProperties,Set<String> contansProperties) {
            _propertiesToExclude = properties==null?Collections.emptySet():properties;
            _prffixPropertiesToExclude = prffixProperties==null?Collections.emptySet():prffixProperties;
            _suffixPropertiesToExclude = suffixProperties==null?Collections.emptySet():suffixProperties;
            _contansPropertiesToExclude = contansProperties==null?Collections.emptySet():contansProperties;
        }

        @Override
        protected boolean include(BeanPropertyWriter writer) {
            return !exclude(writer.getName());
        }

        @Override
        protected boolean include(PropertyWriter writer) {
            return !exclude(writer.getName());
        }
        private boolean exclude(String name){
            boolean exclude=_propertiesToExclude.contains(name)||
                    _prffixPropertiesToExclude.stream().filter(k->name.startsWith(k)).count()>0||
                    _suffixPropertiesToExclude.stream().filter(k->name.endsWith(k)).count()>0||
                    _contansPropertiesToExclude.stream().filter(k->name.contains(k)).count()>0;
            return exclude;
        }
    }
}
发布了66 篇原创文章 · 获赞 17 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/ligeforrent/article/details/94757247