SpringMVC(五):JSON
本文是按照狂神说的教学视频学习的笔记,强力推荐,教学深入浅出一遍就懂!b站搜索狂神说或点击下面链接
https://space.bilibili.com/95256449?spm_id_from=333.788.b_765f7570696e666f.2
JSON
JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式,其实就是前后端交互数据的一种格式。---个人理解其实就是重写toString的格式,只要输出是String类型是JSON格式的就可以了。
在 JavaScript 语言中,一切都是对象。
JSON 是 JavaScript 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串。
在一些公司中,如果是前后端分离的,我们就不会在Controller里面直接定向页面,而是传递一个JSON格式的字符串。
示例html
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>Title</title>
-
- <script type="text/javascript">
- //编写一个JavaScript对象
- var user = {
- name:"任中沛",
- age:3,
- sex:"男"
- };
-
- //将js对象转换为JSON对象
- var json = JSON.stringify(user);
-
- console.log(json);
- console.log(user);
-
- //将JSON对象转换为JavaScript对象
- var obj = JSON.parse(json);
- console.log(obj);
- </script>
-
-
- </head>
- <body>
-
- </body>
- </html>
通过Jackson工具生成JSON格式
导入依赖
这里使用的是jackson,但是其实还有其他的也能实现
- <!--jackson-->
- <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
- <dependency>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-databind</artifactId>
- <version>2.10.3</version>
- </dependency>
测试类
- package com.rzp.controller;
-
-
- import com.fasterxml.jackson.core.JsonProcessingException;
- import com.fasterxml.jackson.databind.ObjectMapper;
- import com.rzp.pojo.User;
- import org.springframework.stereotype.Controller;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.ResponseBody;
-
- @Controller
- public class UserController {
-
- //produces ="application/json;charset=utf-8"是为了中文不乱码
- @RequestMapping(value = "/j1",produces ="application/json;charset=utf-8")
- @ResponseBody //增加ResponseBody,就不会走视图解析器,会直接返回一个字符串
- public String json1() throws JsonProcessingException {
-
- ObjectMapper mapper = new ObjectMapper();
-
- //创建一个对象
- User user = new User("rzp",3,"男");
- //调用Jackson的ObjectMapper对象的writeValueAsString方法,转化为JSON字符串
- String str = mapper.writeValueAsString(user);
-
- return str;
- }
- }
-
测试结果
可以看到,其实就是一个重写的toString方法,我们自己实现也是可以的。
JSON传递List
- @RequestMapping("/j2")
- public String json2() throws JsonProcessingException {
- ObjectMapper mapper = new ObjectMapper();
-
- List userList = new ArrayList();
- User user1 = new User("rzp1",3,"男");
- User user2 = new User("rzp2",3,"男");
- User user3 = new User("rzp3",3,"男");
-
- userList.add(user1);
- userList.add(user2);
- userList.add(user3);
- String str = mapper.writeValueAsString(userList);
- return str;
- }
传递日期
传递后默认会解释为时间戳
-
- @RequestMapping("/j3")
- public String json3() throws JsonProcessingException {
- ObjectMapper mapper = new ObjectMapper();
- Date date = new Date();
- String str = mapper.writeValueAsString(date);
- return str;
- }
如果想传递为可读格式,可以使用SimpleDateFormat直接转换
- @RequestMapping("/j3")
- public String json3() throws JsonProcessingException {
- ObjectMapper mapper = new ObjectMapper();
- Date date = new Date();
- //自定义日期的格式
- SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-
- String str = mapper.writeValueAsString(sdf.format(date));
- return str;
- }
也可以通过ObjectMapper的设置转换
- @RequestMapping("/j3")
- public String json3() throws JsonProcessingException {
- ObjectMapper mapper = new ObjectMapper();
- //关闭以时间戳形式显示日期
- mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);
- SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- //设定mapper的日期格式
- mapper.setDateFormat(sdf);
- Date date = new Date();
- //自定义日期的格式
- // String str = mapper.writeValueAsString(sdf.format(date));
- String str = mapper.writeValueAsString(date);
- return str;
- }
前后端分离的注解
在上面例子中,我们使用ResponseBody注解,来控制这个类返回的字符串不走视图解析器。除了这个配置方式以外,我们还可以在类上面使用RestController注解。
- ...
- @ResponseBody //增加ResponseBody,就不会走视图解析器,会直接返回一个字符串
- public String json1() throws JsonProcessingException {
- ....
RestController
- @RestController
- public class UserController {
- @RequestMapping(value = "/j1")
- //这种情况就不需要给ResponseBody了
- public String json1() throws JsonProcessingException {
- ObjectMapper mapper = new ObjectMapper();
- User user = new User("rzp",3,"男");
- String str = mapper.writeValueAsString(user);
- return str;
- }
- }
封装成utils
- public class JsonUtils {
- public static String getJson(ObjectMapper mapper,String dataFormat) throws JsonProcessingException {
- mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);
- SimpleDateFormat sdf = new SimpleDateFormat(dataFormat);
- mapper.setDateFormat(sdf);
- Date date = new Date();
- String str = mapper.writeValueAsString(date);
- return str;
- }
- public static String getJson(ObjectMapper mapper) throws JsonProcessingException {
- return getJson(mapper,"yyyy-MM-dd HH:mm:ss");
- }
- public static String getJson(ObjectMapper mapper,Object object) throws JsonProcessingException {
- return mapper.writeValueAsString(object.toString());
- }
- }
测试
- @RequestMapping("/j4")
- public String json4() throws JsonProcessingException {
- ObjectMapper mapper = new ObjectMapper();
- String str = JsonUtils.getJson(mapper,"yyyy-MM-dd HH:mm:ss");
- return str;
- }
- @RequestMapping("/j2")
- public String json2() throws JsonProcessingException {
- ObjectMapper mapper = new ObjectMapper();
- List userList = new ArrayList();
- User user1 = new User("rzp1",3,"男");
- User user2 = new User("rzp2",3,"男");
- User user3 = new User("rzp3",3,"男");
- userList.add(user1);
- userList.add(user2);
- userList.add(user3);
- return JsonUtils.getJson(mapper,userList);
- }
乱码解决
上面我们通过配置RequestMapping的produces属性来解决乱码,但是这种方式每个方法的都要添加,比较麻烦,SpringMVC还提供了另一种统一的方法。
备注:这里走的是JSON,没有走过滤器,所以上一章中过滤器这里是不起作用的
只需要在sprinmvc-servlet.xml的mvc:annotation-driven中配置: <mvc:message-converters register-defaults="true">
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:aop="http://www.springframework.org/schema/aop"
- xmlns:mvc="http://www.springframework.org/schema/mvc"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- https://www.springframework.org/schema/beans/spring-beans.xsd
- http://www.springframework.org/schema/aop
- https://www.springframework.org/schema/aop/spring-aop.xsd
- http://www.springframework.org/schema/context
- https://www.springframework.org/schema/context/spring-context.xsd
- http://www.springframework.org/schema/mvc
- https://www.springframework.org/schema/mvc/spring-mvc.xsd">
- <context:component-scan base-package="com.rzp.controller"/>
- <mvc:default-servlet-handler/>
- <!--springmvc 统一解决json中文乱码问题-->
- <mvc:annotation-driven>
- <mvc:message-converters register-defaults="true">
- <bean class="org.springframework.http.converter.StringHttpMessageConverter">
- <constructor-arg value="UTF-8"/>
- </bean>
- <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
- <property name="objectMapper">
- <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
- <property name="failOnEmptyBeans" value="false"/>
- </bean>
- </property>
- </bean>
- </mvc:message-converters>
- </mvc:annotation-driven>
- <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
- <property name="prefix" value="/WEB-INF/jsp/"/>
- <property name="suffix" value=".jsp"/>
- </bean>
- </beans>
使用fastjson
fastjson是阿里巴巴开发的转换JSON字符串的工具。
依赖
- <!--fastjson-->
- <dependency>
- <groupId>com.alibaba</groupId>
- <artifactId>fastjson</artifactId>
- <version>1.2.68</version>
- </dependency>
使用更简单,直接使用fastjson里面的JSON类静态方法就可以了
- @RequestMapping("/j5")
- public String json5() throws JsonProcessingException {
- List userList = new ArrayList();
- User user1 = new User("rzp1",3,"男");
- User user2 = new User("rzp2",3,"男");
- User user3 = new User("rzp3",3,"男");
- userList.add(user1);
- userList.add(user2);
- userList.add(user3);
- //调用JSON的静态方法
- String str = JSON.toJSONString(userList);
- return str;
- }
【JSONObject 代表 json 对象 】
JSONObject对应json对象,通过各种形式的get()方法可以获取json对象中的数据,也可利用 诸如size(),isEmpty()等方法获取"键:值"对的个数和判断是否为空。其本质是通过实现Map 接口并调用接口中的方法完成的。
【JSONArray 代表 json 对象数组】内部是有List接口中的方法来完成操作的。
【JSON 代表 JSONObject和JSONArray的转化】
JSON类源码分析与使用
仔细观察这些方法,主要是实现json对象,json对象数组,javabean对象,json字符串之间 的相互转化。
阿里巴巴的工具毕竟是中国人编写的,源码也更适合中国人阅读。
SpringMVC(五):JSON的更多相关文章
- Maven搭建SpringMVC+MyBatis+Json项目(多模块项目)
一.开发环境 Eclipse:eclipse-jee-luna-SR1a-win32; JDK:jdk-8u121-windows-i586.exe; MySql:MySQL Server 5.5; ...
- [.net 面向对象程序设计进阶] (13) 序列化(Serialization)(五) Json 序列化利器 Newtonsoft.Json 及 通用Json类
[.net 面向对象程序设计进阶] (13) 序列化(Serialization)(五) Json 序列化利器 Newtonsoft.Json 及 通用Json类 本节导读: 关于JSON序列化,不能 ...
- SpringMVC学习--json
简介 json数据格式在接口调用中.html页面中较常用,json格式比较简单,解析还比较方便.比如:webservice接口,传输json数据. springmvc与json交互 @RequestB ...
- 【Spring学习笔记-MVC-3.1】SpringMVC返回Json数据-方式1-扩展
<Spring学习笔记-MVC>系列文章,讲解返回json数据的文章共有3篇,分别为: [Spring学习笔记-MVC-3]SpringMVC返回Json数据-方式1:http://www ...
- SpringMVC关于json、xml自动转换的原理研究[附带源码分析 --转
SpringMVC关于json.xml自动转换的原理研究[附带源码分析] 原文地址:http://www.cnblogs.com/fangjian0423/p/springMVC-xml-json-c ...
- springMvc中406错误解决,springMvc使用json出现406 (Not Acceptable)
springMvc中406错误解决, springMvc使用json出现406 (Not Acceptable) >>>>>>>>>>> ...
- springMvc解决json中文乱码
springMvc解决json中文乱码 springMvc解决json中文乱码,springMvc中文乱码,spring中文乱码 >>>>>>>>> ...
- SpringMVC(三)-- 视图和视图解析器、数据格式化标签、数据类型转换、SpringMVC处理JSON数据、文件上传
1.视图和视图解析器 请求处理方法执行完成后,最终返回一个 ModelAndView 对象 对于那些返回 String,View 或 ModeMap 等类型的处理方法,SpringMVC 也会在内部将 ...
- springMVC学习总结(四)springmvc处理json数据类型以及fastjson的使用
springMVC学习总结(四)springmvc处理json数据类型以及fastjson的使用 主要内容: 这篇文章主要是总结之前使用springmv接收json的时候遇到的问题,下面通过前台发送a ...
- springMVC 处理json 及 HttpMessageConverter 接口
一.SpringMVC处理json的使用 1.添加依赖jar包 <dependency> <groupId>com.fasterxml.jackson.core</gro ...
随机推荐
- Ajax的封装,以及利用jquery的ajax获取天气预报
1.Ajax的封装 function ajax(type,url,param,sync,datetype,callback){//第一个参数是获取数据的类型,第二个参数是传入open的url,第三个是 ...
- C#窗体排列方式
2020-03-11 每日一例第3天 1.设置父窗体属性:IsMdicontainer设置成true; 2.拖入menustrip控件,修改标题栏中的text文字. 3.点击“加载子窗体”设置代码: ...
- vux中表单验证,在提交时自动聚焦到未验证通过的那栏;及循环表单的验证
首先vux中的表单验证在点击触发,失焦时才显示错误信息,如果不管它,它就没反应,这显然是不合理的:解决办法就是:在提交时做验证,不通过的话就使用.focus()及.blur()方法给它聚焦,失焦. i ...
- javascript中怎么判断两个数据类型相等
在 JavaScript 中,判断一个变量的类型尝尝会用 typeof 运算符,在使用 typeof 运算符时采用引用类型存储值会出现一个问题,无论引用的是什么类型的对象,它都返回 "obj ...
- 从零搭建Spring Cloud Gateway网关(二)—— 打印请求响应日志
作为网关,日志记录是必不可少的功能,可以在网关出增加requestId来查询整个请求链的调用执行情况等等. 打印请求日志 打印请求日志最重要的就是打印请求参数这些东西,不过RequestBody通常情 ...
- CMDB_Agent版本
目录 CMDB_Agent版本 CMDB概念 CMDB_Agent介绍 agent方案 ssh类方案 相比较 架构目录 bin-start.py 启动文件 conf-config.py 自定义配置文件 ...
- ThinkPHP5.0 漏洞测试
ThinkPHP5.0 漏洞测试 自从ThinkPHP发布漏洞补丁以来,服务器不知道多少次受到了批量扫描漏洞来抓取肉鸡的请求 虽然官方早已发布补丁,还是想试一下TP漏洞,测试两个漏洞 一.全版本执行漏 ...
- 如何获取主键返回值(MySQL、Oracle)
添加用户.返回主键 --场景:在执行新增用户sql后,service层返回新增用户的主键值(与mybatis一起使用) insert into user(username, sex, birthday ...
- leetcode 签到 914. 卡牌分组
题目 给定一副牌,每张牌上都写着一个整数. 此时,你需要选定一个数字 X,使我们可以将整副牌按下述规则分成 1 组或更多组: 每组都有 X 张牌. 组内所有的牌上都写着相同的整数. 仅当你可选的 X ...
- sql学习~pivot和unpivot用法
pivot 可以把列值转换为输出中的多个列. pivot 可以在其他剩余的列的值上执行聚合函数. unpivot 将列转换为列值 语法 SELECT <non-pivoted column&g ...