Jackson常用注解及应用场景

基本介绍

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"
        }
    ]
}

猜你喜欢

转载自blog.csdn.net/m0_37742400/article/details/130520154