2026/8/15 14:05:39

注解作用:@DateTimeFormat, @JsonFormat,@JsonProperty,@JsonIgnoreProperties(value={“hibernateLazyInitializ

注解作用:@DateTimeFormat, @JsonFormat,@JsonProperty,@JsonIgnoreProperties(value={“hibernateLazyInitializ DateTimeFormat(patternyyyy-MM-dd HH:mm:ss) 反序列化时候给前台的数据格式化了JsonFormat(pattern yyyy-MM-dd HH:mm:ss,timezone GMT8) 序列化时候前台给后台的数据存库格式化private Date submitdate;JsonFormatJackson 家的负责JSON 格式的交互。无论是返回序列化还是接收反序列化只要前端传的是application/json并且后端用RequestBody接收都由它管。你注释为“返回前端”不完整它其实也管接收比如前端传2026-08-14进来它负责转成 Java 对象。DateTimeFormatSpring 家的负责非 JSON 格式的交互。管的是表单提交application/x-www-form-urlencoded、URL 查询参数RequestParam和路径变量PathVariable。你注释为“接收前端”是对的但只限于表单/URL传参场景JSON传参它无效。2. 两个都写时到底谁生效重点如果字段是日期类型如Date且前端传的是JSONJsonFormat会完全接管DateTimeFormat会被忽略因为 Jackson 处理 JSON 的优先级高于 Spring 的格式化。如果只写DateTimeFormat而不写JsonFormat那么返回 JSON 给前端时日期会变成 Jackson 默认的时间戳数字格式比如1723651200000而不是你想要的yyyy-MM-dd。js中格式化时间var time cpic.getSystemTime();time.format(yyyy-MM-dd);*****************************************************遇到一个问题前端按照平常方式传给我json对象属性名和我一致我在controller层也按平常方式使用RequestBody注解用相应的实体类接收参数但别人可以成功接到参数而我的却不能在实体类的成员变量上增加JsonProperty属性名就解决了问题查了一下这个注解JsonProperty 此注解用于属性上作用是把该属性的名称反序列化为另外一个名称如把trueName属性反序列化为name返回前端JsonProperty(name)。import com.fasterxml.jackson.annotation.JsonProperty;public class Student implements Serializable{JsonProperty(name)private String trueName;public String getTrueName() {return trueName;}public void setTrueName(String trueName) {this.trueName trueName;}}测试一下import com.fasterxml.jackson.core.JsonProcessingException;import com.fasterxml.jackson.databind.ObjectMapper;public class Main {public static void main(String[] args) throws JsonProcessingException {Student student new Student();student.setTrueName(张三);//使用writeValuesAsString的方法就可以把对角转化成json字符串。System.out.println(new ObjectMapper().writeValueAsString(student));}}得到结果{name:张三}注意事项:类和父类必须都实现序列化后才可以反序列化类没有实现序列化也可以使用此注解序列化感觉这个注解的作用是1.前端传参数过来的时候使用这个注解可以获取到前端与注解中同名的属性 2。后端处理好结果后返回给前端的属性名也不以实体类属性名为准而以注解中的属性名为准JsonProperty(access JsonProperty.Access.WRITE_ONLY)private String message;可以将值返回前端时候忽略掉比如密码不需要显示在前端数据中但是从前端传送给后端时候可以保存到数据库中JsonProperty.Access.READER_ONLY 就是读******************************Jackson相关:使用Jackson相关的注解时一定要注意自己定义的属性命名是否规范。命名不规范时会失去效果。例如Ename Eage 为不规范命名。“nameE”“ageE”为规范命名我在此处掉坑半个小时。至于命名规范大家自己搜索。其实不要太奇葩的命名都是可以得。如果使用JsonIgnore注解不起效时请注意一下你的属性名字是否规范1、JsonIgnoreProperties此注解是类注解作用是json序列化时将java bean中的一些属性忽略掉序列化和反序列化都受影响。写法将此标签加在model 类的类名上 可以多个属性也可以单个属性//生成json时将name和age属性过滤JsonIgnoreProperties({name},{age})public class user {private String name;private int age;}//生成json时将name和age属性过滤JsonIgnoreProperties({name},{age})public class user {private String name;private int age;}2、JsonIgnore此注解用于属性或者方法上最好是属性上作用和上面的JsonIgnoreProperties一样。生成json 时不生成age 属性public class user {private String name;JsonIgnoreprivate int age;}3、JsonFormat此注解用于属性或者方法上最好是属性上可以方便的把Date类型直接转化为我们想要的模式比如JsonFormat(pattern “yyyy-MM-dd HH-mm-ss”)4、JsonSerialize此注解用于属性或者getter方法上用于在序列化时嵌入我们自定义的代码比如序列化一个double时在其后面限制两位小数点。5、JsonDeserialize此注解用于属性或者setter方法上用于在反序列化时可以嵌入我们自定义的代码类似于上面的JsonSerialize6、Transient[email protected]射,ORM框架将忽略该属性如果一个属性并非数据库表的字段映射就务必将其标示为Transient否则ORM框架默认其注解为Basic//表示该字段在数据库表中没有Transientpublic int getAge() {return 11;}