Python 官方文档:入门教程 => 点击学习
目录前情摘要场景分析一场景分析二场景分析三场景分析四前情摘要 上回说道,小明同学用@JSONProperty解决了,在接口通讯中的json反序列化问题。 经过研究,小明发现@Json
上回说道,小明同学用@JSONProperty解决了,在接口通讯中的json反序列化问题。
经过研究,小明发现@JsonProperty在特定场景下,还有更人性化的作用。
并且在项目中相继使用了@JsonIgnore和@NotNull两兄弟。下面继续场景分析。
小明做了一个WEB表单,用来填写并保存数据,后台写restful接口接收数据并保存。
写完之后让老大review的时候,自信满满的小明,又收到了很多comment。
小明看到了这些comment发现确实有不足之处,比如表单里的有些数据是必须不为空的,虽然在页面上加上了强校验(Js校验),但是后台接口是对外开放的restful接口,别人不走页面直接访问接口存储数据,这时候页面的校验就显得很尴尬了,小明又想这好办啊,直接拿接收到的参数进行非空判断不就行了么,其实也是可以的,但是小明在研究@JsonProperty的时候发现@NotNull正好解决这个问题。
代码展示如下:
Student类
public class Student {
@JsonProperty(value="real_name")
private String name ;
@NotNull(message="idcard is not null")
private String idCard;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getIdCard() {
return idCard;
}
public void setIdCard(String idCard) {
this.idCard = idCard;
}
}
StudentController.java
(注:这里为了测试方便未按照标准的restapi书写,如需学习标准的restful接口风格请移步百度。请见谅)
@RestController
public class StudentController {
@RequestMapping(value="/student",method=RequestMethod.POST)
public Student save(@RequestBody @Valid Student student) {
return student;
}
}
Postman测试如下:
(条件是:正常输入real_name和idCard,返回结果正常)
Postman测试结果如下
(条件:只写real_name,不填写idCard。报错)
注意接口书写时,用@RequestBody接收输入参数时,这时候也需要匹配你预先定义的@JsonProperty的值。
参考real_name.并且,在参数前需要加上@Valid,你定义的@NotNull校验才会生效。
@JsonProperty(value="real_name")
private String name ;
idCard为用户的敏感信息,在接口返回数据中不能展示出来,以免用户敏感信息直接暴露在外。
这时候,小明想到了另外一个注解,@JsonIgnore,在Student对象序列化为json数据的返回的时候,忽略该属性。
代码及测试如下:
@JsonProperty(value="real_name")
private String name ;
@JsonIgnore
private String idCard;
Postman测试如下
(条件:正常输入real_name和idCard,观察返回数据,只包含real_name)
在场景二中提到使用@JsonIgnore可以让接口在返回数据的时候不序列化一些属性。
但是小明又想了,若场景一和场景二结合使用,及在用户输入表单保存数据的时候,某个字段不能为空,并且返回数据的时候又不能包含该属性,是不是可以使用组合注解@JsonInGore和@NotNull呢,
代码和测试结果如下:
@JsonProperty(value="real_name")
private String name ;
@JsonIgnore
@NotNull(message="idcard is not null")
private String idCard;
Postman测试结果如下
(条件:idCard及为上述特殊字段,结果报错)
经过尝试,小明想到了如下解决方案,代码及测试结果如下:
@JsonProperty(value="real_name")
private String name ;
@JsonProperty(access=Access.WRITE_ONLY)
@NotNull(message="idcard is not null")
private String idCard;
Postman测试结果如下
(条件:用JsonProperty代替JsonIgnore)
成功实现需求。
由于小明公司秉承尽最大努力少使用第三方的资源的原因,项目中关于JsonObject相关的jar都是使用的org.json,并未使用阿里的fastjson,如果项目使用的是fastjson,再使用上述的注解就不起作用了,它有自己的一套注解来解决上述问题,
如:@JSONField,具体可参考com.alibaba.fastjson.annotation包。感兴趣的可以查一下。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。
--结束END--
本文标题: 关于@JsonProperty,@NotNull,@JsonIgnore的具体使用
本文链接: https://lsjlt.com/news/166326.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-03-01
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0