1、JSON数据格式
(1)JSON介绍
JSON(JavaScript Object Notation,JS对象标记)是一种轻量级的数据交换格式。它是基于ECMAScript的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简介和清晰的层次结构使得JSON成为理想的数据交换语言。
(2)JSON语法格式
JSON对象的语法有三种:对象、数组、混合模式
类型 | 语法 | 解释 |
对象类型 | {name:value,name:value...} | 其中name是字符串类型,而value是任意类型 |
数组类型 | [value,value,value...] | 其中value是任意类型 |
混合类型 | [{},{}... ...]或{name:[]... ...} | 合理包裹嵌套对象类型和数组类型 |
(3)JSON格式书写规范
1、使用{}和 [ ]书写,{}表示对象类型,[ ]表示数组类型
2、对象类型中每组数据之间用逗号隔开,每组中的关键词与值之间用冒号隔开
3、数组类型中每个值之间用逗号隔开,最后一个值后面不要加逗号
1、对象类型
{"name":"张三" , "age":17}
2、数组类型
["张三" , "李四" , "王五" , 15 , 16]
3、混合模式 对象的value是数组,数组的元素是对象
{"name":["张三" , "李四"] , "age":17}
[{"name":"张三","age":15},{"name":"张三","age":15}]
[{"name":["张三","李四",["赵六","田七",{"sex":"男"}]]},"张三"]
package com.ujiuye.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/demo04Servlet")
public class Demo04Servlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//设置请求响应字符集
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
PrintWriter w = resp.getWriter();
/**
* 把json格式的字符串 响应回去
*
*/
//1、对象类型
String json1 = "{\n" +
"\t\"name\": \"张三\",\n" +
"\t\"age\": 17\n" +
"}";
//w.print(json1);
//2、数组类型
String json2 = "[\"张三\", \"李四\", \"王五\", 15, 16]";
//w.print(json2);
//3、混合模式
String json3 = "[{\n" +
"\t\"name\": \"张三\",\n" +
"\t\"age\": 15\n" +
"}, {\n" +
"\t\"name\": \"张三\",\n" +
"\t\"age\": 15\n" +
"}, {\n" +
"\t\"name\": \"张三\",\n" +
"\t\"age\": 15\n" +
"}]";
w.print(json3);
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<script src="js/jquery-3.6.0.min.js"></script>
</head>
<body>
</body>
</html>
<script>
//请求后台
$.get("demo04Servlet",function (obj) {
//console.log(obj.name,obj.age) 接收json对象
/*console.log(obj) 接收json数组
for (var i = 0; i < obj.length; i++) {
console.log(obj[i])
}*/
console.log(obj)
for (var i = 0; i < obj.length; i++) {
console.log(obj[i].name,obj[i].age)
}
},"json")
</script>
2、JSON数据的应用
json的转换工具是通过java封装好的一些jar工具包,直接将java对象或集合转换成json格式的字符串。
(1)常见的JSON转换工具
工具名称 | 介绍 |
Jsonlib | java类库,需要导入的jar包较多 |
Gson | google提供的一个简单的json转换工具 |
Fastjson | alibaba技术团队提供的一个高性能的json转换工具 |
Jackson | 开源免费的json转换工具,springmvc转换默认使用jackson |
(2)使用步骤
1、导入json相关jar包
2、创建java对象或集合
3、使用jacksion的ObjectMapper对象的writerValueAsString方法进行转换
(3)转换代码实现
package com.ujiuye.servlet;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.ujiuye.bean.Student;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* jackson json转换工具
* 作用:将java中的对象、集合、数组...转成json格式的字符串
*/
@WebServlet("/demo05Servlet")
public class Demo05Servlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//设置请求响应字符集
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
PrintWriter w = resp.getWriter();
/*//1、java对象
Student student = new Student(1,"小花","摘花");
//转成json类型
ObjectMapper om = new ObjectMapper();
String json = om.writeValueAsString(student);
System.out.println(json);//{"sid":1,"sname":"小花","hobby":"摘花"}
w.print(json);*/
/*//2、List集合
List<Student> lists = new ArrayList<>();
lists.add(new Student(1,"小丽","学英语"));
lists.add(new Student(2,"小红","学英语"));
lists.add(new Student(3,"小芳","学英语"));
ObjectMapper om = new ObjectMapper();
String json = om.writeValueAsString(lists);
System.out.println(json);
//[{"sid":1,"sname":"小丽","hobby":"学英语"},{"sid":2,"sname":"小
红","hobby":"学英语"},{"sid":3,"sname":"小芳","hobby":"学英语"}]
w.print(json);*/
/*//3、数组
Student[] arr = new Student[3];
arr[0] = new Student(1,"小丽","学英语");
arr[1] = new Student(2,"小红","学英语");
arr[2] = new Student(3,"小梅","学英语");
String json = new ObjectMapper().writeValueAsString(arr);
System.out.println(json);
//[{"sid":1,"sname":"小丽","hobby":"学英语"},{"sid":2,"sname":"小
红","hobby":"学英语"},{"sid":3,"sname":"小梅","hobby":"学英语"}]
w.print(json);*/
//4、boolean类型 不需要转成json
//w.print(true);
//5、map集合
Map<String,Student> map = new HashMap<>();
map.put("stu1",new Student(1,"小青","学英语"));
map.put("stu2",new Student(2,"小红","学英语"));
map.put("stu3",new Student(3,"小丽","学英语"));
String json = new ObjectMapper().writeValueAsString(map);
System.out.println(json);
//{"stu2":{"sid":2,"sname":"小红","hobby":"学英语"},"stu3":
{"sid":3,"sname":"小丽","hobby":"学英语"},"stu1":{"sid":1,"sname":"小
青","hobby":"学英语"}}
w.print(json);
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<script src="js/jquery-3.6.0.min.js"></script>
<html>
<head>
<title>Title</title>
</head>
<body>
</body>
</html>
<script>
$.get("demo05Servlet",function (obj) {
console.log(obj.stu1.sname)
//遍历
/*
{"sid":1,"sname":"小花","hobby":"摘花"}
obj代表要遍历的对象
key代表对应的属性名
*/
for(var key in obj) {
//通过属性名去获取属性值
// 对象.key 对象[key] key是常量 使用对象.key 比如student.namestudent.age
// key是变量 使用对象[key]
console.log(obj[key])
}
},"json")
</script>