Json
Json是什么
JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式,目前使用特别广泛。
采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
在我之前的一篇博客中有所讲解,在我们学习面向对象时,我们往往会创建多个对象,为了判断这些对象是不是同一个对象,通常会采用System.out.println(对象名);
语句来直接打印对象的地址来进行判断,实际上系统会默认在我们打印的对象后面加上.toString()
来调用toString()
方法获取对象的地址值的字符串表现形式。
为了更大程度上发挥toString
方法的作用,我们会重写这个从Object
类继承过来的方法,这时调用toString
方法就可以打印我们的对象中的一些成员变量信息,更有价值,这个时候的toString方法就类似我们这里需要讲解的Json
Json的基本语法
在 JS 语言中,一切都是对象。因此,任何JS支持的类型都可以通过 JSON 来表示,例如字符串、数字、对象、数组等。看看他的要求和语法格式:
-
对象表示为键值对
-
数据由逗号分隔,最后一个数据不能加逗号
-
花括号保存对象
-
方括号保存数组
JSON 键值对是用来保存 JS 对象的一种方式,和 JS 对象的写法也大同小异,键/值对组合中的键名写在前面并用双引号 “” 包裹,使用冒号 : 分隔,然后紧接着值:
代码示例
{"name": "QiangJingzhou"}
{"age": "3"}
{"sex": "男"}
很多人搞不清楚 JSON 和 Js 对象的关系,甚至连谁是谁都不清楚。其实,可以这么理解:
JSON 是 JS 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串。
var obj = {a: 'Hello', b: 'World'}; //这是一个对象,注意键名也是可以使用引号包裹的
var json = '{"a": "Hello", "b": "World"}'; //这是一个 JSON 字符串,本质是一个字符串
Json和XML的比较
-
可读性:JSON和XML的可读性可谓不相上下,一边是简易的语法,一边是规范的标签形式,很难分出胜负。
-
可扩展性:XML天生有很好的扩展性,JSON当然也有,没有什么是XML可以扩展而JSON却不能扩展的。不过JSON在Javascript主场作战,可以存储Javascript复合对象,有着xml不可比拟的优势。
基于上面的两种比较,所以Json大多用在前端进行交互数据,而xml进行环境的配置
Json的代码讲解
在我们之前已经讲过的大项目下创建一个Module,这个子项目是Maven的Web项目,在项目下进线一些目录以及文件的创建,最后的目录结构如图所示
在json1.html文件中IDE自动生成的结构是
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
</body>
</html>
我们需要在 <body>
标签中添加<script>
标签,在这个标签里面我们才可以进行Javascript代码的编写
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!--type属性其实也可以不需要text/javascript,因为script标签默认是JavaScript-->
<script type="text/javascript">
//编写一个对象
var user = {
name:"qiang",
age:3,
sex:"男"
}
//输出一下这个对象
console.log(user)
</script>
</body>
</html>
在编写完成后我们运行这段代码
在浏览器中点击鼠标右键进行审查元素
可以看到我们之前创建好的JS对象以及对象中的内容
现在我们将JS对象转换为Json字符串
//将JS对象转换为Json字符串
var str = JSON.stringify(user);
console.log(str);
在之前的程序中添加如上所述的代码,不用运行发布,直接刷新网页
可以看到打印的Json字符串为{"name":"qiang","age":3,"sex":"男"}
,这也对应着我们之前讲解的Json格式
接下来我们将Json字符串解析为JS对象
//接下来我们将Json字符串解析为JS对象
var parse = JSON.parse(str);
console.log(parse);
在原程序中添加上面所述的代码,不用运行发布,直接刷新网页
可以看到我们又将Json字符串转换为了JS对象
Json的用途
现在前后端分离,数据交互异常重要,Json就是王者
我们打开百度搜索界面,在这个界面中按F12键打开控制台,最上一栏选择Network
当我们用鼠标键点击一下搜索栏的时候
就可以看到一个请求,请求类型是xhr,就是异步交互,这是Ajax的底层,查看这个请求
可以看到json以及请求的地址以及请求的方式,我们在搜索栏中输入数字1,可以接受到第2个请求
查看第2个请求的响应
可以看到相应就是Json格式的字符串
但是我们的请求都是以sug开头的,这又是为什么
点击右键查看源代码,可以看到sugHost后面有一串URL,这就是请求的主机,所以我们的请求都是以sug开头的,我们在百度搜索东西时,我们的动作就会被转换为请求去请求百度的主机,并且带回响应的结果
我们直接请求主机,选中sugHost后面的一串URL点击鼠标右键直接搜索
可以看到返回一个Json字符串,我们请求了一个链接,返回了一个字符串
在这个链接后面有个参数叫wd,我们让这个wd为1,回车
可以看到返回的Json字符串,这就像我们在百度搜索栏中输入1时主机自动返回的数据一样
我们可以修改wd参数来查看其他情况下主机返回的结果,在这里不一一演示
这个请求的参数就像我们之前web程序中的controller包下的类一样,我们可以通过设置response来返回一个Json字符串来起到和上面的讲解类似的功能
将Json用到Web程序中
在我们上面已经创建好的Module中,我们开始编写程序
在之前创建好的目录结构下新建各种配置文件,最终目录结构如下图所示
1.在编写一个web项目时,先不用导包,最重要的是先配置好web.xml,我们需要写入servlet以及配置过滤器来防止乱码
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--关联SpringMVC配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<!--这个东西要和服务器一起启动;
load-on-startup,启动级别,数字越小级别越高!-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--字符编码过滤-->
<filter>
<filter-name>encodingFilter</filter-name>
<!--<filter-class>com.kuang.filter.GenericEncodingFilter</filter-class>-->
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<!--参数:CharacterEncodingFilter-->
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
在编写完web.xml文件后,就该编写springmvc-servlet.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:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
https://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">
<!--扫描指定包下的注解,让指定的类能够被IOC容器管理-->
<context:component-scan base-package="com.westos.controller"/>
<!--静态资源过滤-->
<mvc:default-servlet-handler/>
<!--annotation-driven:支持MVC注解驱动 -->
<mvc:annotation-driven/>
<!--
视图解析器
作用;方便统一管理
-->
<bean id="InternalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--前缀-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!--后缀-->
<property name="suffix" value=".jsp"/>
</bean>
</beans>
在编写完springmvc-servlet.xml文件后,因为是web项目,我们就需要编写controller目录下的文件,但在此之前我们先需要在pojo目录下编写一个实体类User
package com.westos.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 + '\'' +
'}';
}
}
在编写完实体类后我们就可以进行UserController类的编写,在编写UserController类时,用到@ResponseBody
注解,使用这个注解前需要导入依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>