专业的JAVA编程教程与资源

网站首页 > java教程 正文

springboot从小白到大神-007处理Json数据进阶

temp10 2024-10-10 12:18:36 java教程 7 ℃ 0 评论


作为后端开发人员,json这个词儿恐怕每天都要听到n多次,我们前面的课程几乎每篇也都用到了json,那么我们今天来深入了解一下json在springboot中的使用。

springboot从小白到大神-007处理Json数据进阶

在springboot的项目中,当controller返回的结果是一个对象(比如Book)或者对象数组(比如List<Book>)、对象集合(比如Collection<Book>)时,在前端看到的就是json格式的数据,这是因为springboot已经内置了json解析功能,它是通过引用jackson来自动完成这个功能的(如果你愿意的话,也可以把jackson换成是阿里的fastjson或者其他json解析器),其实这里和上一节介绍redis时的情况类似,也有对象序列化和反序列化的问题,只不过jackson都帮我们自动完成了,而且做得不错,所以我们基本不用关心这事儿!

那么,jackson除了把对象或对象集合转换成json格式返回给前端之外,还能做什么呢,咱们今天就来聊聊这个;


还是和之前一样,新建一个springboot项目chapter-07,在向导过程中,只需要选择引入web模块就可以了;

先定义一下:在本节中,序列化是指把java对象转换为json,而反序列化是指把json转换为java对象;

上面图中解释一下@RequestBody,这个意思是说把http的包体部分当做一个整体映射(解析)为对应的 User user变量,也就是所谓的反序列化,这个转换是由springboot默认使用的jackson来完成的;示例如下:

另外:@GetMapping = @RequestMapping + method: GET

@PostMapping = @RequestMapping + method: POST

类似的还有@PuTMapping和@DeleteMapping

在序列化和反序列化的过程中,我们可能需要对整个过程做一些调整,这时候并不需要像传统模式那样写很多代码去实现功能,而使用jackson的注解就可以完成绝大部分需求了;参见User.java文件中的注解,说明一下,User.java中所有的注解都去掉,应用也是可以跑起来的,而每个注解都是对基本的序列化和反序列化功能的增强,我们下面一一讲解:

@JsonInclude(value=Include.NON_NULL) 这个注解的意思是说,在序列化的过程中,如果对象的某个属性的值为空null,则这个属性就不会出现在json中;可能是前端这么要求,也可能是减少数据传输流量的要求;

@JsonPropertyOrder(alphabetic=true) 序列化之后的json中,各个key按照字母顺序排列;这个。。。可能是因为这样看起来舒服点儿吧;

@JsonIgnoreProperties(value={"address"}, ignoreUnknown=false) 序列化和反序列化时都忽略address这个属性(可以设定多个属性,用逗号隔开);这个的实际用途我还没碰到过。。。

@JsonProperty(access=Access.WRITE_ONLY, value="anothername" )

private String password; 对象中的属性名为password,而在json中的键值定义为anothername,并且这个属性只允许反序列化,而不允许序列化;典型的应用就是password字段,新建用户的时候需要提交密码,而查询用户信息的时候当然不需要把密码字段输出给前端了;

@JsonSerialize(using=MySexSerializer.class)

@JsonDeserialize(using=MySexDeserializer.class)

private Integer sex; 这个注解就是对某个属性进行完全自定义的序列化和反序列化转换了,可以随心所欲啦,当然也稍微麻烦点儿,需要自己分别写两个class;示例很完整,自行参考;

// 序列化和反序列化时都会忽略对象的这个属性

@JsonIgnore

private String address; 序列化和反序列化时忽略对象的某个属性,这个跟上面那个 @JsonIgnoreProperties作用一样的,只不过上面那个可以直接定义多个属性,这里只能针对某一个属性;

@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")

private Date birthday; 这个注解很常用,可以把Date类型的属性(时间戳)转换为可读的指定格式;不仅是序列化,反序列化时也可以起到作用(也就是说json中既可以写yyyy-MM-dd HH:mm:ss这样的字符串,也可以写表示毫秒数的时间戳,jackson都可以自动实现转换)

jackson还有不少可用的注解,功能更强劲的也有,上面提到的是我认为最常用的几个,这东西主要还是得多练习才能理解,消化,融会贯通;

今天就到这里喽,祝大家好运~~~~

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表