这些是我在b站听狂神老师讲解的JSON部分内容,所整理的笔记,如果大家发现有什么不合理或者有误的地方,还望大家指正。
目录
一、JSON介绍
JSON(JavaScript Object Notation,JS对象标记)是一种轻量级的数据交换格式,采用完全独立与编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输速率。
在JS语言中,一切都是对象。因此,任何JS支持的类型都可以通过JSON来表示,例如字符串、数字、对象、数组等。看看他的要求和语法格式:
- 对象表示为键值对
- 数据由逗号分隔(最后一条数据不用加逗号)
- 花括号保存对象
- 方括号保存数组
JSON键值对是用来保存JS对象的一种方式,和JS对象的写法也大同小异,键值对组合中的键名写在前面用双引号" "包裹起来,使用冒号 : 分隔,然后紧接着值,如下代码所示:
{"name":"ZhangSan"}
{"age":7}
{"sex":"男"}
JSON是JS对象的字符串表示法,它使用文本表示一个JS对象的信息,本质是一个字符串,相当于Java中的对象给toString了,如下代码所示:
//这是一个JS对象
var obj = {a:'Hello',b:'World'};
//这是一个JSON字符串,本质是一个字符串,相当于把Java中对象给toString了
//这里的这个JSON字符串,在java中就相当于个把obj这个对象给toString了,可以这样简单的理解
var json = '{"a":"Hello","b":"World"}';
二、JSON和JS对象互转
要实现从JS对象转换为JSON字符串,使用JSON.stringify()方法,如下代码所示:
var json = JSON.stringify({a:'Hello',b:'World'}); //结果是 '{"a":"Hello","b":"World"}'
要实现从JSON字符串转换为JS对象,使用JSON.parse()方法,如下代码所示:
var obj = JSON.parse('{"a":"Hello","b":"World"}'); //结果是{a:'Hello',b:'World}
2.1 JS对象转换为JSON字符串
<script type="text/javascript">
//编写一个对象
var user={
name:"张三",
age:7,
sex:"男"
};
//在控制台上打印user对象
console.log(user);
//将js对象转换为json字符串
var str=JSON.stringify(user);
//打印转换之后的json字符串
console.log(str);
</script>
在浏览器中控制台上的显示效果如下图所示:
2.2 JSON字符串转换为JS对象
这里的代码是在上面1.2.1中的基础上编写的。
<script type="text/javascript">
//编写一个对象
var user={
name:"张三",
age:7,
sex:"男"
};
//在控制台上打印user对象
console.log(user);
//将js对象转换为json字符串
var str=JSON.stringify(user);
//打印转换之后的json字符串
console.log(str);
//将json字符串转换为js对象
var obj = JSON.parse(str);
//打印转换之后的js对象
console.log(obj);
</script>
在浏览器中控制台上的显示效果如下图所示:
平时比较常见的一种JSON格式如下所示:
{
"name":"张三",
"age":7,
"sex":"男"
}
前后端分离,数据交互变得异常重要,JSON就是王者。(可以理解为JSON就是为了实现前后的的数据交互的)
三、真实案例
3.1 百度上的JSON应用案例
经过以上两图的对比,可以看出JSON在百度搜索上的应用。当在百度的搜索框中输入“1”时,便返回JSON数据。
https://suggestion.baidu.com/su?wd=1https://suggestion.baidu.com/su?wd=1
以上链接为百度网页源码中的链接。
四、简单JSON案例实现
4.1 案例步骤
说明:
如果在springMvc-config.xml配置文件中没有编写以下代码。
<!-- JSON格式化乱码处理方式-->
<mvc:annotation-driven>
<!-- 解决json乱码问题 让jackson自己的编码失效,从而使用设置的编码格式-->
<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>
就需要在@RequestMapping注解上定义produces这个属性,produces属性用于指定响应体返回的类型和编码格式。
这样返回到浏览器中的JSON格式,才不会出现乱码的问题,否则会出现乱码。
如下代码所示:
@RequestMapping(value = "/json1",produces = "application/json;charset=utf-8")
步骤:
1、创建maven项目。
2、在项目中创建相应的目录结构如下图所示。
3、在pom文件中的dependencies标签内,添加相关的依赖。
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.22</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.3.22</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.22</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.3.22</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0</version>
</dependency>
</dependencies>
4、在java目录下面创建com.zs.controller、com.zs.pojo、com.zs.utils包。
如下图所示:
5、在pojo包下创建一个User实体类,伪造一个对象,具体代码如下所示:
package com.zs.pojo;
public class User {
private String name;
private int age;
private String sex;
public User() {
}
public User(String name, int age, String sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
'}';
}
}
6、在controller包下面创建UserController类,再在resources目录下面创建SpringMVC的配置文件springMvc-config.xml,具体内容如下所示:
<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-4.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd">
<!-- 指定需要扫描的controller层的包 -->
<context:component-scan base-package="com.zs.controller"/>
<mvc:default-servlet-handler/>
<!-- JSON格式化乱码处理方式-->
<mvc:annotation-driven>
<!-- 解决json乱码问题 让jackson自己的编码失效,从而使用设置的编码格式-->
<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 id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
7、配置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">
<!-- 配置springMvc的核心控制器DispatcherServlet -->
<servlet>
<servlet-name>sprintMvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 指定springMvc的配置文件的位置 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springMvc-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- servlet映射的配置 -->
<servlet-mapping>
<servlet-name>sprintMvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 配置编码过滤器 -->
<filter>
<filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
8、编写控制层代码,具体代码如下所示:
package com.zs.controller;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.zs.pojo.User;
import com.zs.utils.JsonUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
//将该类标记为控制器
@Controller
public class UserController {
/*如果在springMvc-config.xml文件中,没有配置解决JSON格式化乱码的相关配置
需要在@RequestMapping这个注解中添加produces属性
produces:指定响应体返回类型和编码
具体如下所示:
@RequestMapping(value = "/json1",produces = "application/json;charset=utf-8")
对于这块内容可以见以上的说明。
*/
@RequestMapping(value = "/json1")
/*正常返回它会走视图解析器,而json需要返回的是一个字符串
市面上有很多的第三方jar包可以实现这个功能。比如jackson、fastjson(阿里巴巴的)
这里用jackson来实现
使用jackson先在pom文件中导入它的相关依赖,如下所示:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.2</version>
</dependency>
*/
/*
添加上@ResponseBody注解,就不会跳转到视图解析器了,而是返回JSON字符串
@ResponseBody将服务器端返回的对象转换为json对象响应回去
*/
@ResponseBody
public String json1() throws JsonProcessingException {
//需要一个jackson对象映射器,其实就是一个类,使用它可以直接将对象转换为字符串
ObjectMapper mapper = new ObjectMapper();
//创建一个对象
User user = new User("张三1",7,"男");
//将java对象转换为json字符串
String str = mapper.writeValueAsString(user);
/*之前return,会跳转到视图解析器上
但是现在加上了@ResponseBody注解,就不会跳转到视图解析器上了
而是会将str以json格式的字符串返回
*/
return str;
}
//对以上方法的精简化
@RequestMapping(value = "/json2")
@ResponseBody
public String json2() throws JsonProcessingException {
User user = new User("张三2",7,"男");
return new ObjectMapper().writeValueAsString(user);
}
//将多个对象转换成JSON字符串
@RequestMapping("/json3")
@ResponseBody //这个东西是Spring的,只要是Spring的就可以用了
public String json3() throws JsonProcessingException {
List<User> list = new ArrayList<>();
User user1 = new User("张三1",7,"男");
User user2 = new User("张三2",8,"男");
User user3 = new User("张三3",9,"男");
User user4 = new User("张三4",10,"男");
User user5 = new User("张三5",11,"男");
list.add(user1);
list.add(user2);
list.add(user3);
list.add(user4);
list.add(user5);
return new ObjectMapper().writeValueAsString(list);//这个东西只是来格式化对象
}
//返回JSON格式的时间问题
@RequestMapping("/time1")
@ResponseBody //这个东西是Spring的,只要是Spring的就可以用了
public String time1() throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
//1.关闭时间戳功能,时间戳的功能默认是开启的,现在给关闭了
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);
//2.自定义日期格式对象
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//3.让mapper指定时间日期格式为simpleDateFormat
mapper.setDateFormat(simpleDateFormat);
//4.写一个日期对象
Date date = new Date();
return mapper.writeValueAsString(date);
}
//发现问题,重复代码太多,编写一个工具类
//在utils包下建立一个JsonUtils类
@RequestMapping("/time2")
@ResponseBody
public String time2() throws JsonProcessingException {
//拥有工具类之后,这里就可以改成一行代码了
return JsonUtils.getJson(new Date());
}
}
9、关于utils包中,JsonUtils类中的内容 ,如下代码所示:
package com.zs.utils;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import java.text.SimpleDateFormat;
public class JsonUtils {
//定义静态的方法
public static String getJson(Object object,String dateFormat){
ObjectMapper mapper = new ObjectMapper();
//1.关闭时间戳功能,时间戳功能默认是开启的,现在给关闭了
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);
//2.自定义日期格式对象
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(dateFormat);
//3.让mapper指定时间日期格式为simpleDateFormat
mapper.setDateFormat(simpleDateFormat);
try {
return mapper.writeValueAsString(object);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return null;
}
//方法重载
public static String getJson(Object object){
return getJson(object,"yyyy-MM-dd HH:mm:ss");
}
}
4.2 案例运行效果
json1运行效果:
json2运行效果:
json3运行效果:
time1运行效果:
time2运行效果: