96SEO 2026-02-23 12:34 2
联系qq184480602加我进群大家一起学习一起进步一起对抗互联网寒冬

上篇主要复习了HTTP以及POST相关的几种传参形式这一篇来讲讲和实际开发更为紧密的内容JSON。
无法通过看页面原型图分析出大致的请求格式和响应格式即使能分析出请求格式却不知道用什么样的Java对象接收即使能分析出响应格式却不知道用什么样的Java对象返回
这三个能力其实都依赖于你对JSON的理解本文主要讨论JSON不涉及表单请求和文件上传类型。
说得更具体些就是初学者往往搞不清楚JSON与Java对象的转换关系图片来自尚硅谷
在我刚入行时写过相关的博客比较简单感兴趣的同学可以看看AJAX与JSON
JSON简单来说就是特定格式的字符串注意它的载体是字符串。
很多人分不清JSON和JS对象其实两者没有可比性。
实在要说的话JS对象和Java对象都是正儿八经的对象存活于内存中浏览器/服务器而JSON只是字符串往往承担的是网络传输的角色
我们都知道网页上的动态数据都是服务器那边组装后通过HTTP返回的但很少有人会思考这样的一个问题
服务器组装数据时用的是Java对象比如user.setName(bravo)但前端得到的却是JS对象怎么做到的
一般来说浏览器被安装在我们的个人电脑中而提供服务的Java应用则可能运行在阿里云服务器上两者并不在同一片物理内存。
由于对象存活必须依赖于内存如果不做持久化只要一断电内存中的数据就没了所以就上图而言Java对象显然没法自己“跳出”服务器进入浏览器中更别提Java对象如何变成JS对象。
要想完成跨内存的数据传输、对象转换必须通过网络传输而且需要一个传递信息的载体过程中还涉及到序列化和反序列化。
服务器端把Java对象序列化为JSON中介特定格式的字符串网络不能直接传递对象但可以传输字符串浏览器得到JSON后反序列化为JS对象然后设置到页面上
同理不仅是浏览器和服务器服务器和服务器之间也需要JSON作为数据交互的中介
Body就是请求体内容一般都是字符串格式所以这是一个JSON而不是JS对象尽管它们看起来很像。
你可以理解为JSON是多种语言共同协定的一种数据交互格式
{}可以代表Java对象/Map[]由于表示一组数据刚好可以对应Java的数组、List或Set等单列集合{}也可以代表Python对象/字典[]对应Python的元组或list等{}还可以代表PHP的对象[]对应PHP中的Array...
初学者都“见过”JS对象而且它往往都是{}的形式出现JS对象的格式和JSON确实比较像
但JSON本质是“干瘪瘪”的字符串当各大语言需要进行反序列化时就会按照上面的格式转为内存中“圆鼓鼓”的对象。
应该把JS对象和Java对象看作一个梯队而JSON则在另一个梯队是一个特定格式的字符串。
如果不信的话可以自己动手写一下接口然后用Postman按照图中的格式发送JSON看看接口能不能顺利接收参数。
上面说过JSON的{}可以对应Java的对象或者Map{}两个括号表示对象的边界其实刚好对应类的{}里面的就是对象的字段。
接口返回的是一个HashMap所以很容易想到最终JSON格式是
接着往Map里put了一些value我们先不管value是什么类型
OKJSON的大致结构出来了再深入一层看看xxx是什么。
很明显是一个Java的User对象还是对应{}
其他两个分析过程同理就不演示了思考一下如果User里面有Department会是什么样。
之前介绍过服务器本身没有能力处理JSON和文件上传都要靠第三方组件。
SpringBoot则引入了jackson作为默认的JSON组件其他常见的还有阿里的fastJson和谷歌的gson。
有时我们希望如果字段为null就不要返回给前端可以使用JsonInclude它可以指定很多属性。
JsonInclude还可以加在类上那么该对象所有为null的字段都不会参与JSON序列化。
对于一些老项目或者其他什么原因原本传参使用的是下划线比如user_type而后端用Java改写时又要符合驼峰命名此时可以用JsonProperty做一层“隔离”。
有些同学容易把JsonFormat和DateTimeFormat搞混我们单独开一个小节聊一聊。
首先和大家说一下数据库字段无论是datetime还是timestamp其实都是可以自动对应Java的Date对象一般讨论的所谓时间格式都是指前端的显示格式
刚才我们讨论为什么需要JSON时提到一个观点对象是在内存中存活的无法直接进行网络传输。
但是大家有没有想过
其实里面的字段也是对象也要进行序列化。
SpringBoot引入了jackson作为JSON序列化的组件其中必然包括对Date进行序列化/反序列化的方案。
然而SpringBoot1.x和2.x其实有较大的改动其中就包括对Date格式化的改动。
大家可以沿用刚才的项目给UserPOJO加上birthday字段然后在SpringBoot1.5.9和SpringBoot2.3.4环境下实验。
SpringBoot1.x的返回值是毫秒数SpringBoot2.x是另一种格式当入参和出参时间格式不同时会发生转换此时会出现时间差
SpringBoot1.x传递2020-12-07T22:58:11.00000:00返回16073818910008SpringBoot2.x传递1607353091000返回2020-12-07T14:58:11.00000:00-8
DateTimeFormat只适用于非JSON的POST请求也就是说如果项目本身都是JSON请求你用DateTimeFormat是无效的。
你可以简单理解为
DateTimeFormat走表单请求时间转换器适用于GET、POST表单请求JsonFormat走JSON请求时间转换器适用于POST
生日时间格式很容易写错可以抽取为常量或者使用第三方提供的比如hutool就有*/
全局配置objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);objectMapper.setDateFormat(new
如果说JsonInclude/JsonFormat加到字段上、类上分别是字段级别、类级别那么上面的配置就是整个项目级别因为Spring的bean默认单例而这个唯一的ObjectMapper已经被做了手脚最终所有接口的序列化/反序列化行为都被改写。
作者简介大家好我是smart哥前中兴通讯、美团架构师现某互联网公司CTO
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback