欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

关于@JSONField和@JsonFormat的使用区别说明

程序员文章站 2022-03-24 21:38:10
目录@jsonfield和@jsonformat的区别一、@jsonfield的常用方式@jsonformat与@datetimeformat用法及注意事项@jsonformat@datetimefo...

@jsonfield和@jsonformat的区别

@jsonfield是阿里巴巴下fastjson下的,@jsonformat是jackson下面的。

一、@jsonfield的常用方式

1.1、name的用法:

实体类:

package com.xiaobu.entity; 
import com.alibaba.fastjson.annotation.jsonfield;
import lombok.data; 
import javax.persistence.*;
import java.io.serializable;
 
/**
 * @author xiaobu
 * @version jdk1.8.0_171
 * @date on  2018/12/4 19:00
 * @description v1.0
 */
@data
public class roles implements serializable {
    private static final long serialversionuid = 5775171105018867238l;
 
    @jsonfield(name = "role_id")
    @column(name = "roleid")
    private integer roleid;
 
    @jsonfield(name = "role_desc")
    @column(name = "roledesc")
    private string roledesc;
}

测试类:

/**
     * @author xiaobu
     * @date 2018/12/5 16:53
     * @descprition  表明  json不区分大小写都能转换
     * @version 1.0
     * bean to json:{"role_desc":"admin","role_id":8}
     * 需要转换的json:{"role_desc":"admin","role_id":8}
     * roledesc:admin
     */
    @test
    public void testjsonfield(){
        roles roles = new roles();
        roles.setroledesc("admin");
        roles.setroleid(8);
        string jsonstr=jsonobject.tojsonstring(roles);
        system.out.println("bean to json:"+jsonstr);
        //改变json的key为大写
        jsonstr = jsonstr.touppercase();
        system.out.println("需要转换的json:" + jsonstr);
        roles = jsonobject.tojavaobject(jsonobject.parseobject(jsonstr), roles.class);
        system.out.println("roledesc:"+roles.getroledesc());
    }

1.2 format的用法:

实体类:

 /**
     * 任务接收时间
     */
    @jsonformat(pattern = "yyyy-mm-dd",timezone = "gmt+8")
    @jsonfield(format = "yyyy-mm-dd")
    @column(name="taskaccepttime")
    private date taskaccepttime;
 
    /**
     *任务完成时间
     */
    @jsonformat(pattern = "yyyy-mm-dd hh:mm:ss",timezone = "gmt+8")
    @jsonfield(format = "yyyy-mm-dd")
    @column(name="taskcompletetime")
    private date taskcompletetime;

测试类:

@test
    public void findbyexample() {
        task task = new task();
        task.settaskid("hyr08274-0804");
        example example = new example(task.class);
        example.criteria criteria = example.createcriteria();
        if (stringutils.isnotblank(task.gettaskid())) {
            criteria.andlike("taskid", "%" + task.gettaskid() + "%");
        }
        //taskaccepttime=mon aug 04 00:00:00 cst 2008,taskcompletetime=fri nov 07 00:00:00 cst 2008
        list<task> tasks = taskmapper.selectbyexample(example);
        system.out.println(tasks);
        //""taskaccepttime":"2008-08-04","taskcompletetime":"2008-11-07"
        string fastjsonstr = json.tojsonstring(tasks);
        system.out.println("fastjsonstr = " + fastjsonstr);
        objectmapper mapper = new objectmapper();
        try {
            //""taskaccepttime":"2008-08-04","taskcompletetime":"2008-11-07 00:00:00"
            string ujosn = mapper.writevalueasstring(tasks);
            system.out.println("ujosn = " + ujosn);
        } catch (jsonprocessingexception e) {
            e.printstacktrace();
        } 
    }

@jsonformat(pattern = "yyyy-mm-dd",timezone = "gmt+8") 必须加上时区。

@jsonfield(format = "yyyy-mm-dd")

这两个的作用都是格式化日期时间。且只能作用在日期时间上。

补充:前台传后台

@datetimeformat(pattern="yyyy-mm-dd") 

@jsonformat与@datetimeformat用法及注意事项

@jsonformat

@jsonformat ,使用该注解前需要添加 jackson 相关的依赖包

用于服务器传给前端json数据时对date类型时间进行的格式化

@jsonformat(pattern = "yyyy-mm-dd hh:mm:ss", timezone = "gmt+8")

pattern就表示需要转变的格式,timezone表示处在的时区(国内是东八区)

因为,jackson在序列化时间时是按照国际标准时间gmt进行格式化的,而在国内默认时区使用的是cst时区,两者相差8小时

如果没有用@jsonformat 对时间进行格式化,返回给前端的将是一个时间戳。如图所示。

关于@JSONField和@JsonFormat的使用区别说明

使用了@jsonformat之后,时间格式正确显示。如图所示。

@jsonformat(pattern = "yyyy-mm-dd hh:mm:ss", timezone = "gmt+8")

关于@JSONField和@JsonFormat的使用区别说明

注意事项

@jsonformat(pattern = "yyyy-mm-dd hh:mm:ss", timezone = "gmt+8")

pattern中定义的格式的大小写要注意,不要写错。。。

@datetimeformat

@datetimeformat是spring的注解,spring工程下不在需要额外引入其他依赖

由于客户端传给服务端的时间参数是字符串类型,如果直接使用java.util.date下的date接受的话,会报400的异常(400异常表示服务器不处理该请求,多半是传入的参数问题)

关于@JSONField和@JsonFormat的使用区别说明

可以使用@datetimeformat将客户端发送过来的时间参数转换成想要的类型

@datetimeformat(pattern = "yyyy-mm-dd hh:mm:ss")

pattern定义需要转换的格式(跟前面一样。大小写需要严格定义)

这样

关于@JSONField和@JsonFormat的使用区别说明

服务端就可以正确接收,打印的时间参数为

mon apr 01 16:26:25 cst 2019

注意:@jsonformat与@datetimeformat只是定义时间参数在客户端和服务端之间转换格式,控制台、debug显示的还是java.util.date下的date类型形式,如果想要转换的话可以自己使用simpledateformat

simpledateformat sdf = new simpledateformat("yyyy-mm-dd hh:mm:ss");

一些特殊情况

如果使用pattern = "yyyy-mm-dd"接收上述客户端的参数

关于@JSONField和@JsonFormat的使用区别说明

@datetimeformat(pattern = "yyyy-mm-dd")

这样也能正确接收到,但是会将时分秒全部置为00

mon apr 01 00:00:00 cst 2019

如果使用pattern = "yyyy-mm-dd hh:mm:ss"接收客户端传来的没有时分秒的参数

关于@JSONField和@JsonFormat的使用区别说明

@datetimeformat(pattern = "yyyy-mm-dd hh:mm:ss")

会报400异常!

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。