Jackson動態處理返回字段


有時候業務需要動態返回字段,比如,

場景一:返回 name , birthday, createDate

場景二:返回name, birthday, age

現做個備忘錄,以便參考。

下面是引入的POM

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.9.8</version>
</dependency>

 

創建 JacksonJson過濾器類,代碼如下:


@JsonFilter("JacksonFilter")
public class JacksonJsonFilter extends FilterProvider{

    Map<Class<?>, Set<String>> includeMap = new HashMap<>();
    Map<Class<?>, Set<String>> filterMap = new HashMap<>();

    public void include(Class<?> type, String[] fields) {
        addToMap(includeMap, type, fields);
    }

    public void filter(Class<?> type, String[] fields) {
        addToMap(filterMap, type, fields);
    }
    
    private void addToMap(Map<Class<?>, Set<String>> map, Class<?> type, String[] fields) {
        Set<String> filedSet=new HashSet<>();
        if(fields!=null && fields.length>0){
            for(String filed : fields){
                filedSet.add(filed);
            }
        }
        map.put(type, filedSet);
    }

    @Override
    public BeanPropertyFilter findFilter(Object filterId) {
        throw new UnsupportedOperationException("Access to deprecated filters not supported");
    }

    @Override
    public PropertyFilter findPropertyFilter(Object filterId, Object valueToFilter) {

        return new SimpleBeanPropertyFilter() {

            @Override
            public void serializeAsField(Object pojo, JsonGenerator jgen, SerializerProvider prov, PropertyWriter writer)
                    throws Exception {
                if (apply(pojo.getClass(), writer.getName())) {
                    writer.serializeAsField(pojo, jgen, prov);
                } else if (!jgen.canOmitFields()) {
                    writer.serializeAsOmittedField(pojo, jgen, prov);
                }
            }
        };
    }

    public boolean apply(Class<?> type, String name) {
        Set<String> includeFields = includeMap.get(type);
        Set<String> filterFields = filterMap.get(type);
        if (includeFields != null && includeFields.contains(name)) {
            return true;
        } else if (filterFields != null && !filterFields.contains(name)) {
            return true;
        } else if (includeFields == null && filterFields == null) {
            return true;
        }
        return false;
    }

}

 

寫個Util工具類

public class JsonWareUtil {

    private static ObjectMapper objectMapper = null;

    private static JacksonJsonFilter jacksonFilter = new JacksonJsonFilter();
    
    static {
        if(objectMapper==null){
              objectMapper = new ObjectMapper();

        // 允許對象忽略json中不存在的屬性 objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); // 允許出現特殊字符和轉義符 objectMapper.configure(Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true); // 允許出現單引號 objectMapper.configure(Feature.ALLOW_SINGLE_QUOTES, true); // 忽視為空的屬性  objectMapper.setSerializationInclusion(Include.NON_EMPTY);

       }

    public static void filter(Class<?> clazz, String include, String filter) { if (clazz == null) return; if (StringUtils.isNotBlank(include)) { jacksonFilter.include(clazz, include.split(",")); } if (StringUtils.isNotBlank(filter)) { jacksonFilter.filter(clazz, filter.split(",")); } objectMapper.addMixIn(clazz, jacksonFilter.getClass()); }

 

    /**
     * @param obj 被轉對象
     * @return JSON串
     * 將對象轉JSON字符串
     */
    public static String beanToJson(Object obj) {
        try {

            objectMapper.setFilterProvider(jacksonFilter);
            String jsonString = objectMapper.writeValueAsString(obj);
            return jsonString;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

 

...

下面省略其他封裝的JSON操作方法。

}

 

使用:

public class Test {

     public static void mian(String[] args) {

          // fields: name , birthday, createDate, age

          A a = new A();

          a.setName("test1");
          a.setBirthday("xxxx-xx-xx");

          a.setCreateDate("2019-05-12 12:22:21");

          a.setAge(16);

 

          JsonWareUtil.filter(A.getClass(), "name, birthday", null);

          String json = JsonWareUtil.beanToJson(a);

          System.out.println(json);

     }

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM