JSON 概况以及 JAVA 基本操作 JSON 数据的方式
因为现在的项目大多数都是前后端分离的项目,前端和后端都独立开发和部署。
由后端提供接口,前端从接口获取数据,将数据渲染到页面上。前后端数据传输的格式就是 JSON!
JSON 和 JavaScript 的关系: JSON 是 JavaScript 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串。
var obj = {a: 'Hello', b: 'World'}; //这是一个对象,注意键名也是可以使用引号包裹的
var json = '{"a": "Hello", "b": "World"}'; //这是一个 JSON 字符串,本质是一个字符串
代码示例
创建一个 HTML 文件,在 < head > 中添加 < script > 标签编写示例代码
注:< script > 必须成对出现,否则不生效
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
<script type="application/javascript">
// 创建对象,定义属性并赋值
var user = {
name:"姚青",
age:24,
sex:"男"
}
// 打印 user 对象
console.log(user);
script>
head>
<body>
body>
html>
通过浏览器打开该文件,可以看到打印的对象(对象是可以打开的,字符串不行)
在 JavaScript 中默认提供了一个 JSON 的类,这个类中提供了两个方法,可以实现 JSON 和 JavaScript 的相互转换
parse() :将 JSON 字符串转换为 JavaScript 对象
stringify() :将 JavaScript 对象转换为 JSON 字符串
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
<script type="application/javascript">
var user = {
name:"姚青",
age:24,
sex:"男"
}
// 打印正常对象
console.log(user);
// 打印对象转换后的JSON
var json = JSON.stringify(user);
console.log(json);
// 打印JSON转换的JavaScript 对象
var JavaScript = JSON.parse(json);
console.log(JavaScript);
script>
head>
<body>
body>
html>
Gson:谷歌公司推出的Json解析工具
Gson 主要有 toJson 与 fromJson 两个转换方法,通过这两个方法实现 Json 与 Java 对象之间的相互转换
Gson详解用法
FastJson:阿里巴巴推出的Json解析工具
FastJson 在复杂类型的 Bean 转换 Json 上会出现一些问题,可能会出现引用的类型,导致 Json 转换出错,需要制定引用。
FastJson 采用独创的算法,将解析的速度提升到极致,超过所有 json 库。
<dependency>
<groupId>com.alibabagroupId>
<artifactId>fastjsonartifactId>
<version>1.2.60version>
dependency>
FastJson的使用方法
Jackson:Jackson 是比较著名的一个解析工具
Jackson 是当前用的比较广泛的,用来序列化和反序列化 json 的 Java 的开源框架
Jackson 社 区相对比较活跃,更新速度也比较快,是最流行的 json 解析器之一
Jackson 依赖包,导入 pom.xml 中即可使用
<dependency>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-databindartifactId>
<version>2.9.8version>
dependency>
ObjectMapper 类
ObjectMapper 类(com.fasterxml.jackson.databind.ObjectMapper)是 Jackson 的主要类,它可以帮助我们快速的进行各个类型和Json类型的相互转换。
ObjectMapper 类详解
区别
注:Java工具千千万,处理 json 的工具有很多,大多数都是可以完成数据转换这一过程的,只是不同的工具所呈现的效果不一。所以,选择适合工具即可。
@ResponseBody 注解
1、概念
@ResponseBody 注解,使用在控制层(controller)的方法上。
2、作用
将方法的返回值,以特定的格式写入到response的body区域,进而将数据返回给客户端。
当方法上面没有写ResponseBody,底层会将方法的返回值封装为ModelAndView对象。
如果返回值是字符串,那么直接将字符串写到客户端;如果是一个对象,会将对象转化为 json 串,然后返回给客户端。
@RestController 注解
1、概念
@ResponseBody 注解,使用在控制层(controller)的类上。
2、作用
@RestController 的作用等同于 @Controller + @ResponseBody。并且改注解的作用域是整个类,当类被该注解标记时,类中所有的方法都会返回 JSON ,不用再每一个方法上都添加 @ResponseBody了。
注:当使用 @ResponseBody 注解和 @RestController 注解时,就不会去走视图解析器了,直接返回一个字符串,
代码示例:
配置 SpringMVC 需要的配置
web.xml
<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">
<servlet>
<servlet-name>SpringMVCservlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
<init-param>
<param-name>contextConfigLocationparam-name>
<param-value>classpath:SpringMVC-Servlet.xmlparam-value>
init-param>
<load-on-startup>1load-on-startup>
servlet>
<servlet-mapping>
<servlet-name>SpringMVCservlet-name>
<url-pattern>/url-pattern>
servlet-mapping>
<filter>
<filter-name>encodingfilter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
<init-param>
<param-name>encodingparam-name>
<param-value>utf-8param-value>
init-param>
filter>
<filter-mapping>
<filter-name>encodingfilter-name>
<url-pattern>/url-pattern>
filter-mapping>
web-app>
Spring 配置文件
<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
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.sys.controller"/>
beans>
创建实体类
@Data
public class User {
private String id;
private String name;
private int age;
private String sex;
private String pass;
public User(String id, String name, int age, String sex, String pass) {
this.id = id;
this.name = name;
this.age = age;
this.sex = sex;
this.pass = pass;
}
}
创建 Controller
@Controller
public class UserController {
@RequestMapping("/json")
@ResponseBody
public String getUserJson() {
return new User("1", "姚青", 999, "男", "123456").toString();
}
}
启动 tomcat,发现返回的 Json 中数字类型返回正常,中文乱码
在 Spring 配置文件中配置乱码过滤器
<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>
重新发布项目
代码示例1:将Java对象转换成 JSON
创建 controller,引入 Jackson 工具依赖其余内容不变
@RestController
public class JacksonController {
@RequestMapping("/getJackson")
public String getJackson(){
User user = new User("1", "姚青", 999, "男", "123456");
//创建 jackson 对象映射器,用来解析数据
ObjectMapper objectMapper = new ObjectMapper();
String str;
try {
// 将 java 对象转换成 json
str = objectMapper.writeValueAsString(user);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
return str;
}
}
启动 tomcat,查看结果
代码示例2:返回集合,通过 Jackson 将集合转换成 JSON
在 JacksonController 中新增接口
@RestController
public class JacksonController {
@RequestMapping("/getJackson")
public String getJackson() {
User user = new User("1", "姚青", 999, "男", "123456");
//创建 jackson 对象映射器,用来解析数据
ObjectMapper objectMapper = new ObjectMapper();
String str;
try {
// 将 java 对象转换成 json
str = objectMapper.writeValueAsString(user);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
return str;
}
@RequestMapping("/getJackson2")
public String getJackson2() {
User user = new User("1", "姚青", 999, "男", "123456");
User user2 = new User("2", "姚青2", 998, "男", "123456");
User user3 = new User("3", "姚青3", 997, "男", "123456");
User user4 = new User("4", "姚青4", 996, "男", "123456");
List<User> list = new ArrayList<>();
Collections.addAll(list, user, user2, user3, user4);
//创建 jackson 对象映射器,用来解析数据
ObjectMapper objectMapper = new ObjectMapper();
String str;
try {
// 将 java 对象转换成 json
str = objectMapper.writeValueAsString(list);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
return str;
}
}
运行结果