(十二)、JSON
1.什么是JSON?
前后端分离时代:
后端部署后端,提供接口,提供数据。
- 对象
- JSON
前端独立部署,负责渲染后端,展示数据。
- HTML
(1).json的概念
JSON(JavaScript Object Notation, JS对象简谱)是一种轻量级的数据交换格式。它基于 ECMAScript(European Computer Manufacturers Association, 欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
2.JavaScript与JSON的区别
(1).JavaScript
在JavaScript 语言中,一切都是对象。因此,任何JavaScript支持的类型都可以通过JSON来表示,列入字符串,数字,对象,数组等。
- 对象表示为键值对,数据由逗号分隔
- 花括号表示为对象
- 方括号表示数组
(2)JSON
JSON键值对是用来保存JavaScript对象的一种方式,和JavaScript对象的写法也大同小异,键/值对的键名写在前面并用双引号 " " 包裹,使用冒号 : 分割,然后接着是值。
{"name": "吉士先生"} {"age": 3}
(3).JavaScript与JSON的区别
- JSON 是javaScript 对象的字符串表示法,它使用文本表示一个JS对象的信息,本质是一个字符串。
var obj={a: 'hello' , b: 'world'}; 这是一个对象,注意见名也可以使用引号包裹 var json='{"a" : "hello" , "b" : "world"}'; 这是一个JSON字符串,本质是一个字符串
JSON和JavaScript对象互转
- 要实现从JSON字符串转换为JavaScript对象,使用JSON.parse()方法
var obj=JSON.parse('{"a" : "hello" , "b" : "world"}'); 结果是javaScript对象: {a: 'hello' , b: 'world'};
- 要实现从JavaScript对象转换为JSON字符串,使用JSON.stringify()方法
var obj=JSON.stringify({a: 'hello' , b: 'world'}); 结果是JSON字符串 '{"a" : "hello" , "b" : "world"}'
(4).测试演练
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script type="text/javascript"> <!-- 编写一个JavaScript对象--> var user={ name : "吉士先生", sex : "26" }; console.log(user); // 将js对象转换为JSON字符串 var json=JSON.stringify(user); console.log("js对象转换为JSON字符串为"+json); // 将JSON字符串转换为js对象 var user2=JSON.parse(JSON.stringify(user)); console.log(user2) </script> </head> <body> </body> </html>
(十三)、Controller转JSON数据
- Jackson应该是目前比较好的json解析工具了
- 当然工具不止这一个,比如还有阿里巴巴的fastjason
- 我们这里使用Jackson,使用它需要导入它的jar包
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.10.0</version> </dependency>
1.搭配环境
(0).去Aftrical里面导入lib目录
不要忘记新添加的jar包也要导入进去
(1).导入依赖
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>SpringMVC</artifactId> <groupId>org.example</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>SpringMVC-07-JSON</artifactId> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </properties> <dependencies> <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.10.0</version> </dependency> </dependencies> </project>
(2).配置web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <!-- 注册DispatcherServlet--> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!-- 过滤器--> <filter> <filter-name>encoding</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
(3).配置spring.xml
<?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:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd "> <!-- 扫描注解--> <context:component-scan base-package="Com.Jsxs.Controller"/> <!-- 默认处理器--> <mvc:default-servlet-handler/> <!-- 驱动器--> <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>
2. toString
@ResponseBody 添加上此注解之后此方法就不会走视图解析器了,会返回你真实返回的东西,一般是字符串,实现了前后端分离 @RequestMapping(value = "/j1",produces = {"text/html;charset=UTF-8;","application/json;charset=UTF-8;"})
package Com.Jsxs.Controller; import Com.Jsxs.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 { @RequestMapping(value = "/j1",produces = {"text/html;charset=UTF-8;","application/json;charset=UTF-8;"}) @ResponseBody // 添加上此注解之后此方法就不会走视图解析器了,会返回你真实返回的东西,一般是字符串,实现了前后端分离 public String test(){ // 创建一个对象 User user = new User("吉士先生",21,"男"); String s = user.toString(); return s; } }
返回了对象的内容以字符串的形式;
3.解决JSON乱码的问题【必配】
过滤器解决的是字符集乱码的问题,这个解决的是JSON乱码问题
第一种决绝JSON乱码问题 【推荐】
<?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:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd "> <!-- 扫描注解--> <context:component-scan base-package="Com.Jsxs.Controller"/> <!-- 默认处理器--> <mvc:default-servlet-handler/> <!-- 驱动器--> <mvc:annotation-driven/> <!-- 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>
第二种解决JSON乱码问题 【不推荐】
@RequestMapping(value = "/j1",produces = {"text/html;charset=UTF-8;","application/json;charset=UTF-8;"})
4.@ResponseBody 注解
@ResponseBody 添加上此注解之后此方法就不会走视图解析器了,会返回你真实返回的东西,一般是字符串,实现了前后端分离. 搭配着@Controller进行实现。
package Com.Jsxs.Controller; import Com.Jsxs.pojo.User; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; @Controller //这个注解直接不走视图解析器了,实现前后端分离 public class UserController { @RequestMapping("/j1") @ResponseBody public String test() throws JsonProcessingException { ObjectMapper mapper = new ObjectMapper(); // 创建一个对象 User user = new User("吉士先生",21,"男"); String s = mapper.writeValueAsString(user); return s; } }