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);

     }

}

 

转载于:https://www.cnblogs.com/jimmyshan-study/p/10882507.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/462551.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

技术规划应该写成什么样?

最近总是接触到规划文档的评审。有自己写的&#xff0c;也有看别人写的&#xff0c;还有帮人出谋划策的。 这些规划的题目大概如:公司的未来语言规划、公共资源管理规划、工业化开发规划等等。但凡规划&#xff0c;大概是一件事&#xff0c;要预先考虑到3年&#xff0c;甚至5年…

jBPM4工作流开发实战 之 第五部分 其他知识

jBPM的异步执行介绍jBPM对于所有的流程执行操作默认都是同步的。也就是说&#xff0c;默认是一个活动执行完成后&#xff0c;再执行另一个活动。 如&#xff0c;Task1->Java1->Java2->Task2&#xff0c;在同步的状态下执行&#xff0c;即使Java1活动要耗时一个小时&am…

Java生成二进制文件与Postman以二进制流的形式发送请求

业务描述&#xff1a; 模拟终端&#xff08;智能家居&#xff09;发送HTTP POST请求&#xff0c;请求参数为二进制流&#xff1b;而且&#xff0c;二进制流是加密后的数据&#xff0c;因此调试分两步&#xff1a; 1、Java代码生成加密后数据&#xff0c;并保存为二进制流文件 &…

Linux下判断cpu物理个数,几核,是超线程还是多核心

原文地址&#xff1a;http://hi.baidu.com/xolee/blog/item/2bedc8b7ef2743e730add16c.html 1. 查看物理CPU的个数#cat /proc/cpuinfo |grep "physical id"|sort |uniq|wc -l 2. 查看逻辑CPU的个数#cat /proc/cpuinfo |grep "processor"|wc -l 3. 查看CPU是…

Linux文件夹权限如何更改?

http://hi.baidu.com/lwvs/blog/item/83245809a30f033de9248835.html 先来了解一下文件属性&#xff0c;在shell环境里输入&#xff1a;ls -l 可以查看当前目录文件。如&#xff1a;drwxr-xr-x 2 nsf users 1024 12-10 17:37 下载文件备份分别对应的是&#xff1a;文件属性 连…

电脑上面玩Android 游戏(.apk文件)

Android模拟器, 下载地址 http://files.cnblogs.com/jx270/BlueStacks-SplitInstaller_native.rar 下载完毕后解压&#xff0c;双击安装, 然后自己去下一些.apk文件&#xff0c;双击即可在电脑上面使用 ps自己配一个手柄,玩游戏不错,

以太网MAC地址

M AC地址有48位&#xff0c;但它通常被表示为12位的点分十六进制数。MAC地址全球唯一&#xff0c;由IEEE对这些地址进行管理和分配。每个地址由两部分组成&#xff0c;分别是供应商代码和序列号。其中前24位二进制代表该供应商代码。剩下的24位由厂商自己分配。 如果48位全是1&…

JQuery最佳实践

作者&#xff1a; 阮一峰 日期&#xff1a; 2011年8月 4日 上周&#xff0c;我整理了《jQuery设计思想》。 那篇文章是一篇入门教程&#xff0c;从设计思想的角度&#xff0c;讲解"怎么使用jQuery"。今天的文章则是更进一步&#xff0c;讲解"如何用好jQuery&quo…

Extracting Text From Image

Microsoft Office Document Imaging 虚拟打印机http://www.codeproject.com/Articles/10130/OCR-with-Microsoft-OfficeExtracting Text From ImageThe following program shows you how to extract text from image. For this youll have add reference (under COM tab) of &q…

Linux平台gcc和动态共享库的基础知识

http://www.javaeye.com/topic/261176 对大多数不从事Linux平台C语言开发的人来说&#xff0c;GNU gcc的一套工具和Linux平台的共享库的使用还是十分陌生的&#xff0c;其实我也不太熟悉&#xff0c;姑且写点基础知识&#xff0c;权当做备忘吧。 一、GNU gcc的编译工具用法 我们…

Excel-在整个工作簿中查找/替换

13、在整个工作簿中查找/替换 调范围为&#xff1a;工作簿&#xff0c;默认是工作表&#xff1b; 转载于:https://www.cnblogs.com/Formulate0303/p/10885194.html

WCF服务实例激活类型编程与开发(转)

【引言】&#xff1a; 在WCF分布式开发必备知识(2):.Net Remoting这 篇文章里我已经介绍过了Net Remoting相关的概念&#xff0c;其中也包括Net Remoting的激活方式&#xff1a;SingleTon模式、SingleCall模式、客户端激活方式。其实WCF服务的激活方式也与此相似。服务激活方式…

UltraEdit中显示空格与回车的问题

原网址&#xff1a;http://blog.sina.com.cn/s/blog_4983ea900100ikot.html ue中如何显示空格及行结尾呢&#xff1f; 视图-->显示空格/制表符and显示行结尾 空格显示为: “”————实际上&#xff0c;有时候是_&#xff0c;有时候是全角的制表符显示为: “&…

DAT模块简介

转自&#xff1a;http://blog.sina.com.cn/s/blog_48fc29af0100ncdu.html DAT模块函数在DM642的EDMA操作中用于搬运数据。DAT_busy()函数用于检测EDMA数据传输过程是否已经结束&#xff0c;定义如下&#xff1a;Uint32 DAT_busy(Uint32 ID); DAT_busy()函数如果返回一个非零值&…

P2237 [USACO14FEB]自动完成Auto-complete

题意大概就是&#xff1a;给出n个字符串&#xff0c;有m个询问&#xff1a;每次给出字符串s&#xff0c;整数k&#xff0c;问在所有以s为前缀的字符串中&#xff0c;字典序第k大的&#xff0c;是那n个串中的第几个。 我一开始做的时候忽略了一个问题&#xff1a;就是对于两个串…

HP-UX的终端TERM要设置成什么,才能输入中文呢?

再问一下,HP-UX的终端TERM要设置成什么,才能输入中文呢? 我试了,可以了,谢谢!非常感谢!/etc/profile中export LANGzh_CN.hp15CNstty cs8stty -istripstty -parenb怎么要设置这么多呀?我单独只设置stty -istrip也可以了,想请教你为什么要设置那么多??谢谢! 网址&#xff1a…

【SDOI 2011】Paint 染色

http://www.zybbs.org/JudgeOnline/problem.php?id2243 题目大意&#xff1a;给你一棵树&#xff0c;节点有颜色&#xff0c;要求可以查询某路径中连续颜色段的数目和修改某一段路径的颜色。 两次拉实之后查询和修改即可。 #include <iostream> #include <cstdio>…

部署Windows Server Update Services 4.0

在 Windows Server 2012 中&#xff0c;WSUS 是可安装以管理和分配更新的服务器角色。WSUS 服务器可以作为组织内其他 WSUS 服务器的更新源。充当更新源的 WSUS 服务器被称为上游服务器。在 WSUS 实现过程中&#xff0c;网络中必须至少有一台 WSUS 服务器连接到 Microsoft 更新…

克罗谈投资策略09

第七章 把注意力集中在长期趋势上&#xff08;2&#xff09; 我接到很多交易者寄来的信和打来的电话&#xff0c;谈论投机交易的各个层面。但是其中匹兹堡一位专业交易者1984年8月所写的一封信&#xff0c;跟上面所说的主题有特别的关联&#xff1a; 大家都说在目前的市场情况下…

dedecms织梦最新0day

拿webshell的方法如下&#xff1a; 网传的都是说要知道后台才能利用&#xff0c;但不用&#xff0c;只要 plus 目录存在&#xff0c;服务器能外连&#xff0c;就能拿shell. 前题条件&#xff0c;必须准备好自己的dede数据库&#xff0c;然后插入数据&#xff1a; insert into d…