如何基于jackson动态序列化指定字段
一、前言
把对象序列化为json字符串输出的库很多,本文我们来看如何基于jackson动态控制哪些属性需要进行序列化。
二、序列化输出方式
对应使用Jackson,需要我们在pom文件中引入下面依赖:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.1</version>
</dependency>
首先简单看下如何使用:
@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对象序列化为字符串,然后打印输出,结果为:
{
"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
:
@Data
static class Car {
private String brand;
@JsonIgnore
private long price;
...
}
同理如果不想要序列化Person中的car属性,在其上添加@JsonIgnore
注解即可。
对应上面情况,我们只能静态的使用@JsonIgnore
注解来过滤不需要序列化的属性,那么有没有办法在运行时进行动态过滤不需要过滤的属性那?其实注解@JsonFilter
,就可以做这个事件。
@JsonFilter("car")
static class Car {
...
}
@JsonFilter("house")
static class House {
...
}
@JsonFilter("person")
static class Person {
...
}
如上首先在所有类上加上对应的注解,然后通过下面代码添加过滤器:
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对象里面,最后执行序列化,运行上面代码,输出如下:
{
"car":{
"brand":"玛莎拉蒂"
},
"house":{
"title":"杭州院子",
"price":10000000
},
"name":"加多"
}
可知序列化时,只序列化了我们指定的字段。上面代码只是一个实例,在运行时,我们可以根据需要动态设置过滤器,来起到动态序列化指定字段的功能。
三、总结
本文我们谈论了如何使用@JsonFilter
进行动态指定需要序列化字段的功能。需要注意的是一旦一个类上加了@JsonFilter
注解,如果没有指定过滤器,则运行时会报错,那么如何让一个类即可以支持动态过滤,又在没指定过滤器的情况下正常运行那?其实很简单,我们可以自定义注解并注册...
- c# IO操作(带进度的文件复制器,读取文本文件的指定行)
- 高科技来了!玩游戏一样开船的时代来了……
- C++库大全
- 人工智能行业前景预测 全球市场或超2700亿元
- Arxiv网络科学论文摘要14篇
- 工信部:网络强国建设2018年重点工作任务
- 刚刚!张小龙再出重磅!微信小程序掀起新零售红利狂潮!
- 无人驾驶系列——深度学习笔记:Tensorflow的安装-windows系统
- 2018年12大顶级云安全威胁
- 缤果盒子为域名意识打call 六位数秒下bingobox.com
- 用Qt写软件系列二:QCookieViewer(浏览器Cookie查看器)
- 用Qt写软件系列一:QCacheViewer(浏览器缓存查看器)
- 用Qt写软件系列三:一个简单的系统工具(上)
- ChartDirector应用笔记(三)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 使用pytorch实现论文中的unet网络
- Python如何优雅删除字符列表空字符及None元素
- php语法检查的方法总结
- PHP实现浏览器格式化显示XML的方法示例
- Laravel框架基于中间件实现禁止未登录用户访问页面功能示例
- PHP的mysqli_stmt_init()函数讲解
- PHP内置函数生成随机数实例
- PHPStudy下如何为Apache安装SSL证书的方法步骤
- PHP的mysqli_thread_id()函数讲解
- thinkPHP框架中layer.js的封装与使用方法示例
- OpenCV+python实现实时目标检测功能
- 在tensorflow实现直接读取网络的参数(weight and bias)的值
- python tkiner实现 一个小小的图片翻页功能的示例代码
- 在Pytorch中使用Mask R-CNN进行实例分割操作
- PHP类的自动加载机制实现方法分析