JSON
1. 什么是JSON
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写,同时也易于机器解析和生成。
JSON定义语法(最下面)
2. 利用JSON实现服务端与JavaScript之间通信
一个简单的例子:
- index_1.jsp中内容:
接收服务端数据并将它写入到响应体中
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<script type="text/javascript">
var stuObj = ${requestScope.key}; // 从request作用域对象得到服务端提供学生对象
window.alert(typeof stuObj + "<br/>" + stuObj.sid + "学员姓名:" + stuObj.sname);
</script>
</head>
<body>
</body>
</html>
- Student.java中内容
一个实体类
public class Student {
private Integer sid;
private String sname;
public Student() {
}
public Student(Integer sid, String sname) {
this.sid = sid;
this.sname = sname;
}
public Integer getSid() {
return sid;
}
public void setSid(Integer sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
}
- ReflectUtil.java
一个工具类,用于将任意对象内容转换为JSON格式字符串返回
public class ReflectUtil {
// 作用:将任意对象内容转换为JSON格式字符串返回
// 参数:一个高级引用类型对象
public static StringBuffer jsonObject(Object obj) {
Class classFile = null;
Field fieldArray[] = null;
StringBuffer str = new StringBuffer("{");
// 1. 获得当前对象隶属的[class 文件]
classFile = obj.getClass();
// 2. 获得类文件所有属性
fieldArray = classFile.getDeclaredFields();
// 3. 获得当前对象所有属性的值
for (int i = 0; i < fieldArray.length; ++i){
Field field = fieldArray[i];
field.setAccessible(true); // 确保私有访问权限可以在class文件外部使用
String fieldName = field.getName(); // 获得属性名称
Object value = null;
try {
value = field.get(obj);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
// 4. 将获得属性及其值拼接为JSON格式字符串
str.append("\"");
str.append(fieldName);
str.append("\":");
str.append("\"");
str.append(value);
str.append("\"");
if (i < fieldArray.length - 1) str.append(",");
else str.append("}");
}
return str;
}
}
- OneServlet.java内容
- 用于从服务端传递数据给index_1.jsp
public class OneServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Student stu = new Student(10, "mike");
// 通过反射机制将Student类型对象内容转换为JSON格式字符串
String str = String.valueOf(ReflectUtil.jsonObject(stu));
request.setAttribute("key", str);
request.getRequestDispatcher("/index_1.jsp").forward(request, response);
}
}
- 效果:
JavaScript对于得到的JSON格式的字符串解析进而从中得到了一个JSON对象,并将该对象中的内容取了出来。
上面把任意对象整成JSON格式字符串的工具类毕竟是我们自己草草写的,存在的问题不少,就比如我们的10在JavaScript的JSON对象中是一个字符串的形式,而不是一个整型,如果要在后面作运算的话还得进一步转换,太麻烦了。
下面我们来学习使用别人写好的JSON工具包,将存在的问题统统击破!😀
首先,我们需要引入以下jar包:
注:这六个jar包缺一不可。
idea中引入jar包教程
使用:
1. json对象字串
// obj是待转换对象
JSONObject jsonObject = JSONObject.fromObject(obj);
String str = jsonObject.toString(); // 得到一个转换好的JSON格式的字符串
2. json数组字串
JSONArray jsonArray = JSONArray.fromObject(list);
String str = jsonArray.toString(); // 得到一个json数组字串
用这种JSON工具包去替换我们上面写的工具类,JavaScript解析得到的JSON对象中sid属性值10就不再是一个字符串类型了,而是一个整型了(即它原本的类型)。