基本介绍
Jackson是一个Java库,用于将Java对象序列化为JSON格式或将JSON格式反序列化为Java对象。Jackson提供了一系列注解,用于控制序列化和反序列化过程中的行为。Jackson的主要特点如下:
① 快速:Jackson是一个高性能的JSON处理库,可以快速地将Java对象序列化为JSON格式或将JSON格式反序列化为Java对象。
② 灵活:Jackson提供了丰富的注解,可以用于控制序列化和反序列化过程中的行为,例如指定JSON属性名称、日期格式、忽略某个属性等。
③ 易用:Jackson的API简单易用,可以轻松地将Java对象序列化为JSON格式或将JSON格式反序列化为Java对象。
支持多种数据格式:除了JSON格式外,Jackson还支持XML、YAML等多种数据格式。
④ 开源:Jackson是一个开源的Java库,可以免费使用和修改。
常用注解
@JsonProperty注解
应用场景:
在实际开发中,我们可能需要将Java对象序列化为JSON格式,或将JSON格式反序列化为Java对象。在这个过程中,我们可能需要控制JSON属性的名称,使其更符合我们的需求。这时,就可以使用@JsonProperty注解来指定属性名称。
举例说明:
假设有一个Java类Person,它有两个属性:name和age。我们希望在将该类序列化为JSON格式时,属性name对应的JSON属性名称为"full_name",属性age对应的JSON属性名称为"years_old"。这时,就可以使用@JsonProperty注解来指定属性名称。
示例代码如下:
public class Person {
@JsonProperty("full_name")
private String name;
@JsonProperty("years_old")
private int age;
// getters and setters
}
例如,如果有一个Person对象,它的name属性为"张三",age属性为25,那么序列化后的JSON格式如下:
{
"full_name": "张三",
"years_old": 25
}
@JsonFormat注解
应用场景:
在实际开发中,我们可能需要将Java对象序列化为JSON格式,或将JSON格式反序列化为Java对象。在这个过程中,我们可能需要控制日期格式,使其更符合我们的需求。这时,就可以使用@JsonFormat注解来指定日期格式。
举例说明:
假设有一个Java类Event,它有两个属性:name和date。我们希望在将该类序列化为JSON格式时,属性date对应的日期格式为"yyyy-MM-dd HH:mm:ss"。这时,就可以使用@JsonFormat注解来指定日期格式。
示例代码如下:
public class Event {
private String name;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
private Date date;
// getters and setters
}
在上面的代码中,我们使用@JsonFormat注解来指定日期格式。当将Event对象序列化为JSON格式时,属性date将被格式化为"yyyy-MM-dd HH:mm:ss"的字符串。
例如,如果有一个Event对象,它的name属性为"会议",date属性为2022年1月1日10点30分,那么序列化后的JSON格式如下:
{
"name": "会议",
"date": "2022-01-01 10:30:00"
}
@JsonIgnore注解
应用场景:
在实际开发中,我们可能需要将Java对象序列化为JSON格式,或将JSON格式反序列化为Java对象。在这个过程中,我们可能需要忽略某些属性,使其不参与序列化和反序列化。这时,就可以使用@JsonIgnore注解来指定忽略属性。
举例说明:
假设有一个Java类Person,它有两个属性:name和age。我们希望在将该类序列化为JSON格式时,忽略属性age。这时,就可以使用@JsonIgnore注解来指定忽略属性。
示例代码如下:
public class Person {
private String name;
@JsonIgnore
private int age;
// getters and setters
}
在上面的代码中,我们使用@JsonIgnore注解来指定忽略属性。当将Person对象序列化为JSON格式时,属性age将被忽略。
例如,如果有一个Person对象,它的name属性为"张三",age属性为25,那么序列化后的JSON格式如下:
{
"name": "张三"
}
@JsonUnWrapped注解
应用场景:
在实际开发中,我们可能需要将Java对象序列化为JSON格式,或将JSON格式反序列化为Java对象。在这个过程中,我们可能需要控制属性的展开,使其更符合我们的需求。这时,就可以使用@JsonUnwrapped注解来指定属性展开。
举例说明:
假设有一个Java类Person,它有两个属性:name和address。其中,address是一个嵌套的Java对象,它有两个属性:province和city。我们希望在将该类序列化为JSON格式时,展开address属性,将其属性展开到Person对象中。这时,就可以使用@JsonUnwrapped注解来指定属性展开。
示例代码如下:
public class Person {
private String name;
@JsonUnwrapped
private Address address;
// getters and setters
}
public class Address {
private String province;
private String city;
// getters and setters
}
在上面的代码中,我们使用@JsonUnwrapped注解来指定属性展开。当将Person对象序列化为JSON格式时,属性address将被展开到Person对象中。
例如,如果有一个Person对象,它的name属性为"张三",address属性的province为"广东省",city属性为"深圳市",那么序列化后的JSON格式如下:
{
"name": "张三",
"province": "广东省",
"city": "深圳市"
}
@JsonView注解
应用场景:
在实际开发中,我们可能需要将Java对象序列化为JSON格式,但是不同的场景需要展示的属性不同。例如,一个用户对象在列表展示时只需要展示用户名和头像,而在详情展示时需要展示更多的属性。这时,就可以使用@JsonView注解来指定不同的视图,控制属性的展示。
举例说明:
假设有一个Java类User,它有三个属性:id、name和avatar。我们希望在将该类序列化为JSON格式时,根据不同的视图展示不同的属性。例如,列表视图只展示id和name属性,详情视图展示所有属性。这时,就可以使用@JsonView注解来指定不同的视图。
示例代码如下:
public class User {
@JsonView(Views.List.class)
private Long id;
@JsonView({Views.List.class, Views.Detail.class})
private String name;
@JsonView(Views.Detail.class)
private String avatar;
// getters and setters
}
public class Views {
public static class List {}
public static class Detail extends List {}
}
在上面的代码中,我们使用@JsonView注解来指定不同的视图。当将User对象序列化为JSON格式时,根据不同的视图展示不同的属性。
例如,如果有一个User对象,它的id属性为1,name属性为"张三",avatar属性为"http://example.com/avatar.jpg",那么序列化后的JSON格式如下:
列表视图:
{
"id": 1,
"name": "张三"
}
详情视图:
{
"id": 1,
"name": "张三",
"avatar": "http://example.com/avatar.jpg"
}
@JsonManagedReference和@JsonBackReference注解
应用场景
在实际开发中,我们可能需要将Java对象序列化为JSON格式,但是Java对象之间存在循环引用的情况。例如,一个用户对象和一个订单对象之间存在一对多的关系,一个订单对象又关联一个用户对象。这时,就会出现循环引用的问题,导致序列化为JSON格式时出现无限递归的问题。这时,就可以使用@JsonManagedReference和@JsonBackReference注解来解决循环引用问题。
举例说明
假设有两个Java类User和Order,它们之间存在一对多的关系。一个用户可以拥有多个订单,一个订单只属于一个用户。我们希望在将这两个类序列化为JSON格式时,避免循环引用的问题。这时,就可以使用@JsonManagedReference和@JsonBackReference注解来解决循环引用问题。
示例代码如下:
public class User {
private Long id;
private String name;
@JsonManagedReference
private List<Order> orders;
// getters and setters
}
public class Order {
private Long id;
private String name;
@JsonBackReference
private User user;
// getters and setters
}
在上面的代码中,我们使用@JsonManagedReference注解和@JsonBackReference注解来解决循环引用问题。当将User对象序列化为JSON格式时,@JsonManagedReference注解指定了orders属性为被管理的属性,而当将Order对象序列化为JSON格式时,@JsonBackReference注解指定了user属性为反向引用的属性。
例如,如果有一个User对象,它的id属性为1,name属性为"张三",orders属性包含两个Order对象,那么序列化后的JSON格式如下:
{
"id": 1,
"name": "张三",
"orders": [
{
"id": 1,
"name": "订单1"
},
{
"id": 2,
"name": "订单2"
}
]
}