@JsonView、@JsonFormat与DateTimeFormat注解的使用

@JsonView、@JsonFormat与@DateTimeFormat注解的使用


Jackson 序列化工具maven依赖:
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.7.5</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.8</version>
</dependency>

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.9.8</version>
</dependency>

 

@JsonView使用场景

在某一些请求返回的JSON中,我们并不希望返回pojo中的某些字段或全部字段。而在另一些请求中需要返回某些字段

 @JsonView的使用步骤

  • 1.使用接口来声明多个视图
  • 2.在值对象的get方法上指定视图
  • 3.在Controller的方法上指定视图

 完整事例代码

User对象定义

public class User{

    /**
     * 用户简单视图
     */
    public interface UserSimpleView{};

    /**
     * 用户详情视图
     */
    public interface UserDetailView extends UserSimpleView{};

    private String username;

    private String password;

    private String age;

    @JsonView(UserSimpleView.class)
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @JsonView(UserDetailView.class)
    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @JsonView(UserSimpleView.class)
    public String getAge() {
        return age;
    }
    
    public void setAge(String age) {
        this.age = age;
    }
}

这里完成了步骤1和步骤2

定义了步骤1的两个视图接口UserSimpleViewUserDetailView,UserDetailView继承UserSimpleViewUserDetailView拥有视图UserSimpleView的属性

完成了步骤2的在相应的get方法上声明JsonView

 定义UserController

@RestController
public class UserController {

    @GetMapping("/user")
    @JsonView({User.UserSimpleView.class})
    public List<User> query(UserQueryCondition userQueryCondition, @PageableDefault(size = 10,page=1,sort = {"username","age"},direction = Sort.Direction.DESC) Pageable pageable){
        System.out.println(userQueryCondition);
        System.out.print(pageable.getPageSize());
        System.out.println(pageable.getSort());
        System.out.println(pageable.getOffset());
        List<User> users = new ArrayList<>();
        users.add(new User());
        users.add(new User());
        users.add(new User());
        return users;
    }

    /**
     * 在url中使用正则表达式
     * @param id
     * @return
     */
    @GetMapping("/user/{id:\\d+}")
    @JsonView(User.UserDetailView.class)
    public User get(@PathVariable String id){
        System.out.println(id);
        User user = new User();
        user.setUsername("tom");
        return user;
    }
}

 

@JsonFormat与@DateTimeFormat注解的使用

背景:从数据库获取时间传到前端进行展示的时候,我们有时候可能无法得到一个满意的时间格式的时间日期,在数据库中显示的是正确的时间格式,获取出来却变成了很丑的时间戳,@JsonFormat注解很好的解决了这个问题,我们通过使用@JsonFormat可以很好的解决:后台到前台时间格式保持一致的问题,其次,另一个问题是,我们在使用WEB服务的时,可能会需要用到,传入时间给后台,比如注册新用户需要填入出生日期等,这个时候前台传递给后台的时间格式同样是不一致的,而我们的与之对应的便有了另一个注解,@DataTimeFormat便很好的解决了这个问题,接下来记录一下具体的@JsonFormat与DateTimeFormat的使用过程。

在你需要查询出来的时间的数据库字段对应的实体类的属性上添加@JsonFormat

public class TestClass {
  
    //设置时区为上海时区,时间格式自己据需求定。
    @JsonFormat(pattern="yyyy-MM-dd",timezone = "GMT+8")
    private Date testTime;
}

这里解释一下:@JsonFormat(pattern="yyyy-MM-dd",timezone = "GMT+8")

   pattern:是你需要转换的时间日期的格式

   timezone:是时间设置为东八区,避免时间在转换中有误差

  提示:@JsonFormat注解可以在属性的上方,同样可以在属性对应的get方法上,两种方式没有区别

注解@DateTimeFormat

@DateTimeFormat(pattern = "yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
private Date symstarttime;

可同时使用

 

 

 

 

posted @ 2019-05-26 11:12  邓维-java  阅读(1695)  评论(0)    收藏  举报