【JSON :JavaScript 对象表示法】
一、 概念
JavaScript Object Notation :JavaScript 对象表示法
- JSON 现在多用于存储和交换文本信息的语法
- 进行数据的传输
- JSON 比 XML 更小、更快、更易解析
1. Java 中创建并封装对象
Person p = new Person();
p.setName("");
p.setAge("");
p.setGender("");
2. 引入 JSON 创建并封装对象
var p = {"name":"张三","age":23,"gender":"男"};
二、 语法
1. 基本规则
- 数据再名称/值对中,JSON 数据都是由键值对构成的
- 键用引号(单双都行)引起来,也可以不使用引号
- 值的取值类型:
- 数字(整数或浮点数)
- 字符串(在双引号中)
- 逻辑值(true 或 false)
- 数组(在方括号中):
{"person":[{},{}]}
- 对象(在花括号中):
{"address":{"province":"北京"......}}
- null
- 数据由逗号分隔:多个键值对由逗号分隔
- 花括号保存对象:使用
{}
定义 JSON 格式 - 方括号保存数组:
[]
2. 获取数据
JSON 对象.键名
JSON 对象["键名"]
数组对象[索引]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JSON数据语法</title>
<script>
// 1. 定义基本格式
var person={"name":"张三",age:23,'gender':true};
alert(person);
// 获取 name 的值
// var name=person.name;
var name=person["name"];
alert(name);
// 2. 第一种嵌套格式,{} → []
var persons={
"persons":[
{"name":"张三","age":23,"gender":true},
{"name":"李四","age":23,"gender":true},
{"name":"王五","age":23,"gender":true}]};
alert(persons);
// 获取王五的值
var name01=persons.persons[2].name;
alert(name01);
// 2. 第二种嵌套模式,[] → {}
var ps=[{"name":"张三","age":23,"gender":true},
{"name":"李四","age":23,"gender":true},
{"name":"王五","age":23,"gender":true}];
// 获取李四的值
alert(ps);
alert(ps[1].name);
// 获取 person 对象中的所有的键和值
// for in 循环
for (var key in person) {
alert(key);
alert(key+":"+person[key]);
}
// 获取 ps 中的所有值
for (var i = 0; i < ps.length; i++) {
var p=ps[i];
for (var key in p) {
alert(key+":"+p[key]);
}
}
</script>
</head>
<body>
</body>
</html>
三、 JSON 解析器
为了实现 JSON 数据和 Java 对象的相互转换
需求:将来在网络中将 JSON 当作数据的载体进行传输
- 引出 JSON 解析器
- 常见的解析器:Jsonlib,Gson,fastjson,jackson
1. Java 对象转换为 JSON 对象
-
Java 对象转换为 JSON
- 使用步骤:
- 导入 jackson 的相关 jar 包
- 创建 jackson 核心对象 ObjectMapper
- 调用 ObjectMapper 的相关方法进行转换
- 转换方法
- 注解
- 复杂 Java 对象转换
- 使用步骤:
-
导入依赖 jar 包,使用 Maven 框架
<dependency>
<groupId>org.wso2.orbit.com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.11.0.wso2v1</version>
</dependency>
<dependency>
<groupId>org.wso2.orbit.com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.11.0.wso2v1</version>
</dependency>
<dependency>
<groupId>org.wso2.orbit.com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.0.wso2v1</version>
</dependency>
- 创建 Person 类
public class Person {
private String name;
private int age;
private String gender;
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 getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", gender='" + gender + '\'' +
'}';
}
}
(1) 转换方法
- 转换方法:
writeValue(参数1,obj);
- 参数1:
- File:将 obj 对象转换为 JSON 字符串,并保存到指定的文件中
- Writer:将 obj 对象转换为 JSON 字符串,并将 JSON 数据填充到字符输出流中
- OutputStream:将 obj 对象转换为 JSON 字符串,并将 JSON 数据填充到字节输出流中
- 参数1:
writeValueAsString(obj);
将对象转为 JSON 字符串
public class JacksonTest {
// Java 对象转为 JSON 字符串
@Test
public void test01() throws Exception {
// 1. 创建 Person 对象
Person p = new Person();
p.setName("张三");
p.setAge(23);
p.setGender("男");
// 2. 创建 Jackson 的核心对象 ObjectMapper
ObjectMapper mapper=new ObjectMapper();
// 转换方法:
// writeValue(参数1,obj);
// 参数1:
// File:将 obj 对象转换为 JSON 字符串,并保存到指定的文件中
// Writer:将 obj 对象转换为 JSON 字符串,并将 JSON 数据填充到字符输出流中
// OutputStream:将 obj 对象转换为 JSON 字符串,并将 JSON 数据填充到字节输出流中
// writeValueAsString(obj); 将对象转为 JSON 字符串
String json = mapper.writeValueAsString(p);
// {"name":"张三","age":23,"gender":"男"}
System.out.println(json);
// writeValue,将数据写到 D:a.txt 文件中
mapper.writeValue(new File("d://a.txt"),p);
// writeValue,将数据关联到 Writer 中
mapper.writeValue(new FileWriter("d://b.txt"),p);
}
}
(2) 注解
- 注解;
- @JsonIgnore:排除属性
- @JsonFormat:属性值的格式化
public class Person {
private String name;
private int age;
private String gender;
// @JsonIgnore // 忽略该属性
@JsonFormat(pattern = "yyyy-MM-dd")
private Date birthday;
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
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 getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", gender='" + gender + '\'' +
'}';
}
}
@Test
public void test02() throws Exception {
// 1. 创建 Person 对象
Person p = new Person();
p.setName("张三");
p.setAge(23);
p.setGender("男");
p.setBirthday(new Date());
// 2. 转换
ObjectMapper mapper=new ObjectMapper();
String json=mapper.writeValueAsString(p);
System.out.println(json);
}
(3) 复杂 Java 对象转换
- 复杂 Java 对象转换
- List:数组
- Map:与对象格式一致
@Test
public void test03() throws Exception {
// 1. 创建 Person 对象
Person p01 = new Person();
p01.setName("张三");
p01.setAge(23);
p01.setGender("男");
p01.setBirthday(new Date());
Person p02 = new Person();
p02.setName("张三");
p02.setAge(23);
p02.setGender("男");
p02.setBirthday(new Date());
Person p03 = new Person();
p03.setName("张三");
p03.setAge(23);
p03.setGender("男");
p03.setBirthday(new Date());
// 2. 创建 List 集合
List<Person> persons = new ArrayList<>();
persons.add(p01);
persons.add(p02);
persons.add(p03);
// 3. 转换
ObjectMapper mapper=new ObjectMapper();
String json=mapper.writeValueAsString(persons);
System.out.println(json);
}
@Test
public void test04() throws Exception {
// 1. 创建 Map 对象
Map<String,Object> map=new HashMap<String,Object>();
map.put("name","张三");
map.put("age",23);
map.put("gender","男");
// 2. 转换
ObjectMapper mapper=new ObjectMapper();
String json=mapper.writeValueAsString(map);
System.out.println(json);
}
2. JSON 对象转换为 Java 对象
- JSON 对象转换为 Java 对象
- 使用步骤:
- 导入 jackson 的相关 jar 包
- 创建 jackson 核心对象 ObjectMapper
- 调用 ObjectMapper 的相关方法进行转换
readValue(JSON 字符串数据,Class)
- 使用步骤:
@Test
public void test05() throws Exception {
// 1. 初始化 JSON 字符串
String json="{\"gender\":\"男\",\"name\":\"张三\",\"age\":23}";
// 2. 创建 ObjectMapper 对象
ObjectMapper mapper = new ObjectMapper();
// 3. 转换为 Java 对象 Person 对象
Person person = mapper.readValue(json, Person.class);
System.out.println(person);
}
四、 案例
校验用户名是否存在
当注册某个用户应用时:注册校验
当文本输入框失去焦点后,发送 AJAX 请求,查询数据库是否存在该用户名
- 如果存在,则提示信息:此用户名太受欢迎,请更换一个
- 如果不存在,则提示信息:可用
- 服务器响应的数据,在客户端使用时,要想当作 JSON 数据格式使用
$.get(type)
:将最后一个参数 type 指定为"json"
- 在服务器端设置 MIME 类型:
response.setContentType("application/json;charset=utf-8");
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册页面</title>
<script src="js/jquery-3.6.1.min.js"></script>
<script>
// 在页面加载完成后
$(function () {
// 给 username 绑定 blur 事件
$("#username").blur(function () {
// 获取 username 文本输入框的值
var username=$(this).val();
// 发送 AJAX 请求
// 期望服务器响应回的数据格式:{"userExist":true,"msg":"此用户名太受欢迎,请更换一个"}
// {"userExist":false,"msg":"用户名可用"}
$.get("findUserServlet",{username:username},function (data) {
// 判断 userExist 键的值是否是 true
var span=$("#s_username");
if (data.userExist){
// 用户名存在
span.css("color","red");
span.html(data.msg);
}else {
// 用户名不存在
span.css("color","green");
span.html(data.msg);
}
},"json");
})
})
</script>
</head>
<body>
<form>
<input type="text" id="username" name="username" placeholder="请输入用户名">
<span id="s_username"></span>
<br/>
<input type="password" name="password" placeholder="请输入密码">
<input type="submit" value="注册">
</form>
</body>
</html>
@WebServlet("/findUserServlet")
public class FindUserServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1. 获取用户名
String username=request.getParameter("username");
// 2. 调用 service 层判断用户名是否存在
// 设置响应的数据
// JSON 数据格式
// response.setContentType("application/json;charset=utf-8");
response.setContentType("text/html;charset=utf-8");
Map<String, Object> map = new HashMap<>();
if ("Tom".equals(username)){
// 存在
map.put("userExist",true);
map.put("msg","此用户名太受欢迎,请更换一个");
}else {
// 不存在
map.put("userExist",false);
map.put("msg","此用户名可用");
}
// 将 Map 转换为 JSON ,并且传递给客户端
// 将 MAP 转换为 JSON
ObjectMapper mapper = new ObjectMapper();
// 并且传递给客户端
mapper.writeValue(response.getWriter(),map);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}