目录
JSON字符串 和 Javabean 对象、List 对象、map 对象之间的转换
JSON简介
1. JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)
2. JSON 是轻量级的文本数据交换格式;独立于语言;具有自我描述性,更易理解
JSON的定义格式
var 变量名 = {
"k1" : value, // Number 类型
"k2" : "value", // 字符串类型
"k3" : [], // 数组类型
"k4" : {}, // json 对象类型
"k5" : [{},{}] // json 数组
};
规则:
1、映射(元素/属性)用冒号 “:” 表示。
"名称":值 , 注意名称是字符串,因此要用双引号引起来
2、并列的数据之间用逗号 “,” 分隔。
"名称 1":值,"名称 2":值
3、映射的集合(对象)用大括号 {} 表示。
{"名称 1":值,"名称 2":值}
4、并列数据的集合(数组)用方括号 [] 表示。
[{"名称 1":值,"名称 2":值}, {"名称 1":值," 名称 2":值}]
5、元素值类型:string, number, object, array, true, false, null
JSON对象和字符串对象相互转换
JSON 是一个内建对象,有方法可以使用
JSON.stringify(json) //将一个 json对象 转换成为 json字符串
JSON.parse( jsonString ) //将一个 json字符串 转换成为 json对象
例子:
<script type="text/javascript">
// 一个 json 对象
var jsonObj = {"name": "小明", age: 10};
// 把 json 对象转换成为字符串对象
var jsonStr = JSON.stringify(jsonObj);
console.log(jsonStr);
// 把 json 对象的字符串,转换成为 json 对象
var jsonObj2 = JSON.parse(jsonStr);
console.log(jsonObj2);
</script>
JSON在Java中的使用
1、java 中使用 json,需要引入到第 3 方的包 gson.jar
2、gson.jar 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库,可以对 JSON 字符串 和 Java 对象 相互转换
3、gson需要得到类的完整路径,然后进行底层反射才能得到需要的类,所以gson 设计者就提供TypeToken类来解决该问题
JSON字符串 和 Javabean 对象、List 对象、map 对象之间的转换
【注:需要引入到第 3 方的包 gson.jar】
主要使用了以下两个方法:
gson.toJson(Book); //java对象 转化为 json字符串
gson.fromJson(strBook, Book.class); //json字符串 转换为 java对象
简单使用:
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class JavaJson {
public static void main(String[] args) {
//创建一个gson对象,作为一个工具对象使用
Gson gson = new Gson();
//javabean对象 和 json字符串的转换
Book book = new Book(100, "JAVA编程");
//1. javebean对象 -> json字符串
String strBook = gson.toJson(book);
System.out.println("strBook=" + strBook);
//2. json字符串->javabean对象
Book book2 = gson.fromJson(strBook, Book.class);
System.out.println("book2=" + book2);
//list对象 和 json字符串的转换
List<Book> bookList = new ArrayList<>();
bookList.add(new Book(200, "数学"));
bookList.add(new Book(300, "英语"));
//1. list对象 -> json字符串
String strBookList = gson.toJson(bookList);
System.out.println("strBookList= " + strBookList);
//2. json字符串 -> list对象
Type type = new TypeToken<List<Book>>() {
}.getType();
List<Book> bookList2 = gson.fromJson(strBookList, type);
System.out.println("bookList2= " + bookList2);
//map对象 和 json字符串的转换
Map<String, Book> bookMap = new HashMap<>();
bookMap.put("k1", new Book(400, "红楼梦"));
bookMap.put("k2", new Book(500, "西游记"));
//1. map对象 -> json字符串
String strBookMap = gson.toJson(bookMap);
System.out.println("strBookMap=" + strBookMap);
//2. json字符串 -> map对象
Map<String, Book> bookMap2 = gson.fromJson(strBookMap,
new TypeToken<Map<String, Book>>() {
}.getType());
System.out.println("bookMap2=" + bookMap2);
}
}
//自定义的一个JavaBean
class Book {
private Integer id;
private String name;
public Book(Integer id, String name) {
this.id = id;
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Book{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
细节说明:
TypeToken之后为何要加 {} ? (1) 如果直接 new TypeToken<List<Book>>() 则会提示 'TypeToken()' has protected access in 'com.google.gson.reflect.TypeToken' 因为TypeToken 的无参构造器是的修饰符是protected,不在同一个包内不能直接访问,因此报错 (2) new TypeToken<List<Book>>(){} 使用就可以,是因为后面多了个 {} ,此时这个类型就不是 TypeToken,而是匿名内部类(可理解为其子类) (3) 当执行该匿名内部类(子类)的无参构造器时, 就会默认执行 super(),从而间接访问了TypeToken 用protected修饰的无参构造器
Ajax简介
1、Ajax 即“ Asynchronous Javascript And XML ”(异步 JavaScript 和 XML)
2、Ajax 是一种浏览器异步发起请求(指定发哪些数据),局部更新页面的技术
JavaScript原生Ajax请求
核心:XMLHttpRequest
简单使用:
//1、创建XMLHttpRequest对象[ajax引擎对象]
var xhr = new XMLHttpRequest();
//2、准备指定数据
var uname = document.getElementById("uname").value;
xhr.open("GET", "/json_ajax/checkUserServlet?uname=" + uname, true);
//3、在send函数调用前,给XMLHttpRequest 绑定一个事件onreadystatechange
//该事件表示,可以去指定一个函数,每当 xhr对象readyState 改变时,
//就会触发 onreadystatechange 事件
xhr.onreadystatechange = function () {
//console.log("xhr=", xhr)
if (xhr.readyState == 4 && xhr.status == 200) {
//获取返回的json数据
var responseText = xhr.responseText;
console.log("返回的信息=" + responseText);
}
}
//4、发送数据
xhr.send();
注意事项:
JavaSE 和 Javaweb方式 加载properties配置文件的方法不同
//JavaSE中加载properties配置文件的方法为:
//properties.load(new FileInputStream("src\\druid.properties"));
//javaweb方式加载properties配置文件的方法为:
//要获取src目录下的文件,需要使用类加载器
properties.load(JDBCUtilsByDruid.class.getClassLoader()
.getResourceAsStream("druid.properties"));
JQuery的Ajax请求
在线文档:https://www.w3school.com.cn/jquery/jquery_ajax_get_post.asp
编写原生的 Ajax 要写很多的代码,还要考虑浏览器兼容问题,使用不方便,在实际工作中,一般使用 JavaScript 的库(比如 Jquery) 发送 Ajax 请求,从而解决这个问题。
常用方法:
(说明:完整的参数参看在线文档)
使用之前需要引入jquery
<!-- 引入jquery -->
<script type="text/javascript" src="./script/jquery-3.6.0.min.js"></script>
$.ajax 方法
常用参数
url: 请求的地址
type : 请求的方式 get 或 post
data : 发送到服务器的数据。将自动转换为请求字符串格式
success: 成功的回调函数
error: 失败后的回调函数
dataType: 返回的数据类型 常用 json 或 text
$.get 和$.post 方法
常用参数
url: 请求的 URL 地址
data: 请求发送到服务器的数据
success: 成功时回调函数
type: 返回内容格式,xml, html, script, json, text
$.getJSON 方法
常用参数
url: 请求发送的哪个 URL
data: 请求发送到服务器的数据
success: 请求成功时运行的函数
说明:$.get、$.post 和 $.getJSON底层还是使用$.ajax()方法来实现异步请求
简单使用:
<!-- 引入jquery-->
<script type="text/javascript" src="./script/jquery-3.6.0.min.js"></script>
<script type="text/javascript">
$(function (){
$("#checkButton").click(function (){
//alert("ok....")
$.ajax({
url:"/json_ajax/checkUserServlet3",
type:"GET",
data:
{
username:$("#uname").val(),
date:new Date()
},
success:function (data, status, xhr){
console.log("data= " + JSON.stringify(data));
console.log("status= " + status);
console.log("xhr= " + JSON.stringify(xhr));
},
error:function (){
alert("失败。。。");
},
dataType:"json"
});
// $.get(
// "/json_ajax/checkUserServlet3",
// {
// username:$("#uname").val(),
// date:new Date()
// },
// function (data, status, xhr){
// console.log("data= " + JSON.stringify(data));
// console.log("status= " + status);
// console.log("xhr= " + JSON.stringify(xhr));
// //alert("get...")
//
// },
// "json"
// )
//
// $.post(
// "/json_ajax/checkUserServlet3",
// {
// username:$("#uname").val(),
// date:new Date()
// },
// function (data, status, xhr){
// console.log("data= " + JSON.stringify(data));
// console.log("status= " + status);
// console.log("xhr= " + JSON.stringify(xhr));
// //alert("post...")
//
// },
// "json"
// )
//
// $.getJSON(
// "/json_ajax/checkUserServlet3",
// {
// username:$("#uname").val(),
// date:new Date()
// },
// function (data, status, xhr){
// console.log("data= " + JSON.stringify(data));
// console.log("status= " + status);
// console.log("xhr= " + JSON.stringify(xhr));
// // alert("getJSON...")
//
// }
// )
})
})
</script>