JavaWeb中使用JSON

前言: 最近也是期末了,有好多好多文档和实验报告要交,所以都没啥时间写文,这段时间清闲了,来补一下之前学习时遗漏的一些知识树,话说就没人吐槽这个JSON图标好丑吗?
什么是JSON
- JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)
- JSON 是轻量级的文本数据交换格式
- JSON 独立于语言
*
- JSON 具有自我描述性,更易理解
JSON 使用 JavaScript 语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。
这里有意思的是,JSON本来是用来表示 JavaScript 对象的一种数据文本格式,但由于它轻量级、易于解析/操作(JavaScript原生支持)的一些特点,渐渐的被很多语言支持也就成了一种标准
为什么使用JSON
在JSON之前,我们通常在网络传输中使用的格式是XML,在我们的印象之中,XML具有很好的可读性,并且格式统一,解析起来也相对比较简单,为什么摒弃掉XML而逐渐的使用起JSON呢?
主要原因在于:JSON比XML更小、更快、更易解析。
- JavaScript原生支持JSON,解析速度相较XML会更快;
- XML解析成DOM对象的时候,浏览器之间会产生差异【例如IE和FireFox】;
- JSON有很多强大的库能够帮助我们更快更简单的完成工作
XML与JSON实例比较
接下来我们通过一个实例的比较来真实的说明一下XML与JSON的区别:
- 使用
XML
表示中国部分省市的数据如下:
- 使用
JSON
中国部分省市数据如下:
-
从编码的可读性来说,
XML
有明显的优势,毕竟人类的语言更贴近这样的说明结构。而JSON
读起来更像是一个数据块,读起来比较费解,不过我们读起来费解的语言,恰恰是适合机器于都的,所以通过JSON
是的索引contry.provinces[0].name
就可以读取到“黑龙江”这个值 -
从编码的手写难度来说,
XML
还是更简单一些,好读也就意味着好写;不过JSON
写出来的字符明显就少很多;去掉空白制表以及换行的话,JSON
就是密密麻麻的有用数据,而XML
却包含很多重复的标记字符。
JSON相比XML的不同之处
- 没有结束标签
- 更短
- 读写的速度更快
- 能够使用内建的 JavaScript eval() 方法进行解析
- 使用数组
- 不使用保留字
对于AJAX应用程序员来说,JSON比XML更快更易使用:
使用XML:
- 读取XML文档
- 使用XML DOM来循环遍历文档
- 读取值并存储在变量中
使用JSON:
- 读取JSON字符串
- 用 eval() 处理JSON字符串
JSON语法
客户端与服务器交换的数据无非就是两种: 数组或者是对象,JSON所表示的数据也就是这两种了
JSON语法是JavaScript语法的子集,在JavaScript中用[]
中括号来表示数组,用{}
大括号来表示对象,JSON也是这样
JSON数组:
[]
中括号里面的内容有些像ArrayList,是一个列表一样的东西
JSON对象:
{}
大括号里面的东西有些像Map,是一对一对的键值对
- 注意:
[]
中括号和{}
大括号之间是可以相互嵌套的
解析JSON
在解析JSON对象之前,我们需要首先地来创造一个JSON对象:
使用HTML解析
在HTML中我们可以直接使用.
点号来直接访问JSON对象的属性:
打开网页我们能正确看到如下效果:

但通常情况中,我们拿到和上传的并不是一个真正的JSON对象,而是一串由JSON转换得来的字符串,我们同样在HTML中模拟解析一下:
打开网页即可看到如下正确效果:

从前端发送JSON数据到后台
我们这里演示使用AJAX请求的方式来提交JSON数据到后台:
- 注意: 在上面的例子中,我们使用了
JSON.stringify()
来将一个JSON对象转换成了一串字符串,并且在AJAX中,我们设置了dataType
和contentType
来告知后台我们传输的是一个JSON数据
简单写一个Controller来验证一下吧:
- @RequestBody 注解后面讲到,这里只做简单演示
JSON库介绍
引用自:几种常用JSON库性能比较
在后台有许多支持解析JSON的库,目前对于Java开源的JSON类库有许多,下面我们介绍三种比较常用的JSON库,并进行比对说明,它们分别是:
-
Gson(项目地址:https://github.com/google/gson)
- Gson是目前功能最全的Json解析神器,Gson当初是为因应Google公司内部需求而由Google自行研发而来,但自从在2008年五月公开发布第一版后已被许多公司或用户应用。Gson的应用主要为toJson与fromJson两个转换函数,无依赖,不需要例外额外的jar,能够直接跑在JDK上。而在使用这种对象转换之前需先创建好对象的类型以及其成员才能成功的将JSON字符串成功转换成相对应的对象。类里面只要有get和set方法,Gson完全可以将复杂类型的json到bean或bean到json的转换,是JSON解析的神器。
-
FastJson(项目地址:https://github.com/alibaba/fastjson)
- Fastjson是一个Java语言编写的高性能的JSON处理器,由阿里巴巴公司开发。无依赖,不需要例外额外的jar,能够直接跑在JDK上。FastJson在复杂类型的Bean转换Json上会出现一些问题,可能会出现引用的类型,导致Json转换出错,需要制定引用。FastJson采用独创的算法,将parse的速度提升到极致,超过所有json库。
-
Jackson(项目地址:https://github.com/FasterXML/jackson)
- 相比json-lib框架,Jackson所依赖的jar包较少,简单易用并且性能也要相对高些。而且Jackson社区相对比较活跃,更新速度也比较快。Jackson对于复杂类型的json转换bean会出现问题,一些集合Map,List的转换出现问题。Jackson对于复杂类型的bean转换Json,转换的json格式不是标准的Json格式。
到底使用哪一个JSON库呢?
我看了一些资料,比较印象深刻的是:FastJson在复杂类型的Bean转换Json上会出现一些问题,但是在解析JSON时却是最快的(具体参考:知乎:fastjson这么快老外为啥还是热衷 jackson?)
总结如下:
- FastJson的API设计的最简单,最方便使用,直接使用JSON的两个静态方法即可完成四种操作;而Gson和Jackson都需要new一个对象;
- 数据量大时,使用Jackson;
- 如果有性能要求可以使用Gson/Jackson将bean转换json确保数据的正确性,使用FastJson将Json转换成Bean
三种JSON库简要使用说明
为了导库简单,我在这里都使用Maven搭建的SpringBoot项目来演示,Maven库的地址在这里:https://mvnrepository.com/
在使用之前,我们先来建设一些基础类,用于支持JSON库的使用:
Gson库使用简要说明
(1)Maven依赖:
(2)使用示例:
好文推荐及扩展阅读:你真的会用Gson吗?Gson使用指南(一)
FastJson库简要使用说明
(1)Maven依赖:
(2)使用示例:
官方文档:戳这里,据官方说法,FastJson比Gson要快上6倍哦!
Jackson库使用简要说明
(1)Maven依赖:
稍微麻烦一点的是Jackson需要依赖三个包
(2)使用示例:
- 几点注意:
1.由于Jackson底层代码抛出了IOEception,所以我们在调用的时候也需要抛出;
2.Jackson所有的操作都是基于ObjectMapper
在框架中使用JSON
SpingMVC和SpringBoot一样,都能通过注解的方式获取并返回一串JSON格式的数据,我们使用SpringBoot的一段实例程序来实际说明一下:
我们在浏览器中访问地址:localhost:8080/jsonCategory
,会得到以下JSON数据:

我们也可以使用 @RequestBody
来获取一串JSON数据:
我们在前台使用的是上面用过的用于提交JSON数据的页面,运行能够成功得到结果:

- 注意: Spring4 之后新加入了
@RestController
注解,是@ResponseBody和@Controller的组合注解,用于返回JSON数据。
欢迎转载,转载请注明出处!
简书ID:@我没有三颗心脏
github:wmyskxz
欢迎关注公众微信号:wmyskxz_javaweb
分享自己的Java Web学习之路以及各种Java学习资料
__EOF__

本文链接:https://www.cnblogs.com/wmyskxz/p/9099693.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?