Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何基于jackson动态序列化指定字段

如何基于jackson动态序列化指定字段

作者头像
加多
发布于 2020-08-11 03:14:51
发布于 2020-08-11 03:14:51
2.1K00
代码可运行
举报
文章被收录于专栏:Java编程技术Java编程技术
运行总次数:0
代码可运行

一、前言

把对象序列化为json字符串输出的库很多,本文我们来看如何基于jackson动态控制哪些属性需要进行序列化。

二、序列化输出方式

对应使用Jackson,需要我们在pom文件中引入下面依赖:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.11.1</version>
</dependency>

首先简单看下如何使用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  @Data
    static class Car {
        private String brand;
        private long price;
        private int load;
        private long id;
    }

    @Data
    static class House {
        private String title;
        private long price;
        private long id;
    }

    @Data
    static class Person {
        private Car car;
        private House house;
        private long weight;
        private long id;
        private String name;
    }

   public static Person makePerson() {
        Person person = new Person();
        person.setName("加多");
        person.setWeight(150);
        person.setId(8888);

        House house = new House();
        house.setId(234);
        house.setTitle("杭州院子");
        house.setPrice(10000000);
        person.setHouse(house);

        Car car = new Car();
        car.setBrand("玛莎拉蒂");
        car.setId(123L);
        car.setLoad(3);
        car.setPrice(1000000);
        person.setCar(car);

        return person;
    }

    public static void main(String[] arg) throws JsonProcessingException {
        //1.造人
        Person person = makePerson();

        //2.序列化为json字符串并输出
        ObjectMapper objectMapper = new ObjectMapper();
        System.out.println(objectMapper.writeValueAsString(person));
    }

如上代码1,创建了一个Person类,代码2创建ObjectMapper,并且调用其writeValueAsString方法,把Person对象序列化为字符串,然后打印输出,结果为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "car":{
        "brand":"玛莎拉蒂",
        "price":1000000,
        "load":3,
        "id":123
    },
    "house":{
        "title":"杭州院子",
        "price":10000000,
        "id":234
    },
    "weight":150,
    "id":8888,
    "name":"加多"
}

如上Person中所有属性,包含其中Car中所有属性,House的所属性都输出了。

如果我们不想序列化某个属性,比如不想序列化Person中的Car中的price属性,则我们只需要在Car类属性上加注解:@JsonIgnore

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   @Data
    static class Car {
        private String brand;
        @JsonIgnore
        private long price;
     ...
    }

同理如果不想要序列化Person中的car属性,在其上添加@JsonIgnore注解即可。

对应上面情况,我们只能静态的使用@JsonIgnore注解来过滤不需要序列化的属性,那么有没有办法在运行时进行动态过滤不需要过滤的属性那?其实注解@JsonFilter,就可以做这个事件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@JsonFilter("car")
static class Car {
 ...
}

@JsonFilter("house")
static class House {
...
}

@JsonFilter("person")
static class Person {
    ...
}

如上首先在所有类上加上对应的注解,然后通过下面代码添加过滤器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public static void main(String[] arg) throws JsonProcessingException {
        //1.造人
        Person person = makePerson();

        //2.序列化为json字符串并输出
        ObjectMapper objectMapper = new ObjectMapper();
        //2.1创建过滤器
        SimpleFilterProvider filterProvider = new SimpleFilterProvider();
        //2.1.1Person类的属性过滤器(只序列化car,house,name字段)
        filterProvider.addFilter("person", SimpleBeanPropertyFilter.filterOutAllExcept(Sets.newHashSet("car", "house", "name")));
        //2.1.2House类的属性过滤器(只序列化title,price字段)
        filterProvider.addFilter("house", SimpleBeanPropertyFilter.filterOutAllExcept(Sets.newHashSet("title", "price")));
        //2.1.3Car类的属性过滤器(只序列化brand字段)
        filterProvider.addFilter("car", SimpleBeanPropertyFilter.filterOutAllExcept(Sets.newHashSet("brand")));

        //2.2设置过滤器,并执行序列化
        objectMapper.setFilterProvider(filterProvider);
        System.out.println(objectMapper.writeValueAsString(person));
    }

如上代码通过2.1.1-2.1.3为Person,House,Car添加了属性过滤器,只序列化指定的字段,然后代码2.2把过滤器设置到ObjectMapper对象里面,最后执行序列化,运行上面代码,输出如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "car":{
        "brand":"玛莎拉蒂"
    },
    "house":{
        "title":"杭州院子",
        "price":10000000
    },
    "name":"加多"
}

可知序列化时,只序列化了我们指定的字段。上面代码只是一个实例,在运行时,我们可以根据需要动态设置过滤器,来起到动态序列化指定字段的功能。

三、总结

本文我们谈论了如何使用@JsonFilter进行动态指定需要序列化字段的功能。需要注意的是一旦一个类上加了@JsonFilter注解,如果没有指定过滤器,则运行时会报错,那么如何让一个类即可以支持动态过滤,又在没指定过滤器的情况下正常运行那?其实很简单,我们可以自定义注解并注册...

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
jackson序列化和反序列化中的注解和扩展点大全【收藏】
通过在属性、getter 方法或类级别上使用 @JsonSerialize 注解,可以指定要使用的序列化器。
公众号:码到三十五
2024/03/19
3.8K0
基于JDK8中Optional写出可读性高的代码
JDK8中引入了函数式编程,大大提高了我们编写代码的可读性,其中Optional则是为了避免NPE而生,下面我们就来看看它是如何提高代码可读性的。
加多
2020/06/08
3760
spring-data Page/Sort类型 jackson序列化模块
注:如果项目使用了spring-cloud-openfeign-core模块则会自动配置这两个类型的反序列化支持
路过君
2024/05/24
1350
Jackson 之 LocalDateTime 序列化与反序列化
在 Java 8 中对 LocalDateTime、LocalDate 的序列化和反序列化有很多种操作
玖柒的小窝
2021/10/31
5.3K0
用好Jackson,操作Json节省一半时间
目前解析Json的工具包有,Gson,FastJson,Jackson,Json-lib。综合来看,Jackson的性能较优,稳定性也比较高,而且spring-boot-starter-web默认会引入Jackson包。因此介绍一下Jackson的使用。
捡田螺的小男孩
2020/07/17
1K0
Spring学习-- SpEL表达式
转载自 https://www.cnblogs.com/goodcheap/p/6490896.html
allsmallpig
2021/02/25
2720
JSON序列化和反序列化还有这种玩法
Mixin对于前端开发者可不陌生,Vue、React等知名前端框架都使用了Mixin。而对于后端开发,尤其是Java后端开发来说Mixin却是一个很陌生的概念。今天来我们通过Jackson让后端开发者也来认识一下Mixin。 场景 比如我们引用了一个Jar包,其中的某个类在某个场景需要反序列化,但是这个类没有提供默认构造。咋办呢?把原来的项目拉下来,重写一下?下下策! 你可以使用Jackson提供的Mixin特性来解决这个问题。 Jackson中的Mixin Jackson中的 Mixin(混入) 我们可以
程序猿DD
2023/04/04
5580
JSON序列化和反序列化还有这种玩法
Jackson用法详解
Jackson 是当前用的比较广泛的,用来序列化和反序列化 json 的 Java 的开源框架。Jackson 社区相对比较活跃,更新速度也比较快, 从 Github 中的统计来看,Jackson 是最流行的 json 解析器之一 。 Spring MVC 的默认 json 解析器便是 Jackson。 Jackson 优点很多。 Jackson 所依赖的 jar 包较少 ,简单易用。与其他 Java 的 json 的框架 Gson 等相比, Jackson 解析大的 json 文件速度比较快;Jackson 运行时占用内存比较低,性能比较好;Jackson 有灵活的 API,可以很容易进行扩展和定制。
三分恶
2020/07/16
15.8K0
中篇|Jackson注解的用法和场景,建议收藏
用于序列化和反序列化中特定格式的数据。虽然我们经常使用它来格式化时间,但是它不单单能格式化时间。
码农小胖哥
2021/07/22
2.2K0
【小家Spring】Redis序列化、RedisTemplate序列化方式大解读,介绍Genericjackson2jsonredisserializer序列化器的坑
上一篇已经介绍了优雅的操作Redis: 【小家Spring】Spring Boot中使用RedisTemplate优雅的操作Redis,并且解决RedisTemplate泛型注入的问题。本篇着重介绍一下几种常用的序列化方式
YourBatman
2019/09/03
8K0
【小家Spring】Redis序列化、RedisTemplate序列化方式大解读,介绍Genericjackson2jsonredisserializer序列化器的坑
除了FastJson,你也应该了解一下Jackson(一)
在上月末的时候收到一条关于fastjson安全漏洞的消息,突然想到先前好像已经有好多次这样的事件了(在fastjson上面)。关于安全方面,虽然中枪的机率微小,但是在这个信息越来越复杂的时代,安全性也变得越来越重要,就像DevSecOps的诞生,在软件交付的整个价值流中我们也需要注重安全这方面。当然我们现在不谈关于FastJson的优劣,因为我们本文的目标是让大家了解和掌握Jackson。
东溪陈姓少年
2020/08/06
1.3K0
上篇|Jackson注解的用法和场景,不看巨亏
今天总结一下Jackson的一系列注解的用法和场景,或许能帮助你实现一些功能,总结不易,还请多多关注、点赞、转发。
码农小胖哥
2021/07/22
2K0
jackson学习之七:常用Field注解
最后要介绍的是JsonRawValue,使用该注解的字段或者方法,都会被序列化,但是序列化结果是原始值,例如字符串是不带双引号的:
程序员欣宸
2022/05/06
7540
jackson学习之七:常用Field注解
Jackson 注解
当涉及到在Java对象和JSON之间进行序列化和反序列化时,Jackson是一个非常流行的库。它提供了一组注解,可以用于控制对象的序列化和反序列化过程。这些注解使得开发人员能够更加灵活地控制JSON和Java对象之间的映射关系,从而简化了开发过程。
收心
2023/10/28
2790
Jackson快速入门
Java生态圈中有很多处理JSON和XML格式化的类库,Jackson是其中比较著名的一个。虽然JDK自带了XML处理类库,但是相对来说比较低级,使用本文介绍的Jackson等高级类库处理起来会方便很多。
乐百川
2019/05/29
3.3K0
Jackson快速入门
Jackson 常用注解
通过 @JacksonInject 注解可以在 Jackson 反序列化的时候为空值字段动态赋值,当反序列化的对应属性值不存在时,可通过该注解为其动态设置值。
BUG弄潮儿
2022/06/07
1.8K0
Jackson笔记
Jackson 是当前用的比较广泛的,用来序列化和反序列化 json 的 Java 的开源框架。Jackson 社 区相对比较活跃,更新速度也比较快, 从 Github 中的统计来看,Jackson 是最流行的 json 解析器之一 。 Spring MVC 的默认 json 解析器便是 Jackson。 Jackson 优点很多。 Jackson 所依赖的 jar 包较少 ,简单易用。与其他 Java 的 json 的框架 Gson 等相比, Jackson 解析大的 json 文件速度比较快;Jackson 运行时占用内存比较低,性能比较好;Jackson 有灵活的 API,可以很容易进行扩展和定制。
Remember_Ray
2020/08/05
12.2K0
用了几年的 Fastjson,我最终替换成了Jackson!
作者:larva-zhh 来源:www.cnblogs.com/larva-zhh/p/11544317.html
Java技术栈
2021/05/11
5.8K0
设置Springboot返回jackson数据序列化
LocalDateTime格式化 使用下面的配置相当于全局配置就不需要给字段添加@JsonFormat(pattern = DateUt.YYYY_MM_DD_HH_MM_SS) 如果个别字段需要不同的配置可使用@JsonFormat(pattern = DateUt.YYYY_MM_DD),@JsonFormat会优先使用,反序列化亦可使用@JsonFormat注解
FHAdmin
2021/08/25
9350
Jackson详解
其中 jackson-databind内部依赖了jackson-annotations与ackson-core,故只导入jackson-databind即可
Java微观世界
2025/01/21
3130
Jackson详解
相关推荐
jackson序列化和反序列化中的注解和扩展点大全【收藏】
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验