网站首页 > java教程 正文
作为后端开发人员,json这个词儿恐怕每天都要听到n多次,我们前面的课程几乎每篇也都用到了json,那么我们今天来深入了解一下json在springboot中的使用。
在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还有不少可用的注解,功能更强劲的也有,上面提到的是我认为最常用的几个,这东西主要还是得多练习才能理解,消化,融会贯通;
今天就到这里喽,祝大家好运~~~~
猜你喜欢
- 2024-10-10 简单的对象转换方法类分享(对象转化为字符串的几种方式)
- 2024-10-10 为什么 JSON 不适合作为配置语言?
- 2024-10-10 JSON 对象的这些操作和使用场景你知道多少?
- 2024-10-10 第27天|Java入门有野,json操作(java的json解析几种方法)
- 2024-10-10 如何使用springmvc返回json格式的数据?
- 2024-10-10 Fastjson2如何进行JSON的解析和对象序列化?
- 2024-10-10 Java笔试题目分享(2)知识点总结——Json对象
- 2024-10-10 面试官问,你知道http请求怎么在你的项目中变成Java对象吗?
- 2024-10-10 Spring Boot 中使用FastJSON来替换默认的JSON数据序列方式?
- 2024-10-10 Java Jackson 中如何 Pending JSON 对象到数组中
你 发表评论:
欢迎- 最近发表
-
- Java常量定义防暴指南:从"杀马特"到"高富帅"的华丽转身
- Java接口设计原则与实践:优雅编程的艺术
- java 包管理、访问修饰符、static/final关键字
- Java工程师的代码规范与最佳实践:优雅代码的艺术
- 编写一个java程序(编写一个Java程序计算并输出1到n的阶乘)
- Mycat的搭建以及配置与启动(mycat部署)
- Weblogic 安装 -“不是有效的 JDK Java 主目录”解决办法
- SpringBoot打包部署解析:jar包的生成和结构
- 《Servlet》第05节:创建第一个Servlet程序(HelloSevlet)
- 你认为最简单的单例模式,东西还挺多
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)