什么是JSON?
JSON(JavaScript Object Notation, JS 对象格式) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
JSON即JS对象的格式:
在Javascript中,使用{}表达式对象,使用[]表示数组,所有的JS数据都是由这两种格式组成.这就是JSON数据格式的标准.本质上由于JSON是字符串.所以使用该格式可以肆意传输.
如何解析JSON?
对于json数据格式的解析,市面技术比较多,主要讲: 原Sun公司-json-lib.jar,阿里-fastjson,google-gson的解析方式。
SUN公司解析方式---------原生JSON解析方式
JSONObject核心方法:
private static void strToJSON() throws Exception {
//JSON 对象格式
String json1 = "{name:'张三',age:1,sex:null}";
//将字符串转化为JSON对象
JSONObject jsonObject = new JSONObject(json1);
// get(name) : 根据指定的key 从 JSON对象中获取对应的值
// getString getBoolean 等等方法都是通过get方法进行数据类型转换
Object name = jsonObject.get("name");
Object age = jsonObject.get("age");
System.out.println(name.toString()+" "+age.toString());
String string = jsonObject.getString("name");
//Object o = jsonObject.get("sex");
// 注意: 当从JSON中根据key获取值时,若没有指定的key,使用get 获取时,会抛异常,表示该JSON没有这个属性.
//has(key) : 判断JSON中是否存在指定的key
boolean flag = jsonObject.has("sex");
System.out.println(flag);
flag = jsonObject.has("name");
System.out.println(flag);
//isNull(key) : 判断指定的key 是否存在或者key对应的值为null
System.out.println(jsonObject.isNull("sex"));
//keys() : 获取所有的key
Iterator keys = jsonObject.keys();
while(keys.hasNext()) {
System.out.println(keys.next());
}
//length : json中元素的个数
System.out.println(jsonObject.length());
//names() : 返回json对象中所有的key
JSONArray names = jsonObject.names();
for(int i=0;i<names.length();i++) {
System.out.println(names.get(i));
}
// 根据key 获取json中的数据 若key不存在则返回默认值
Object phone = jsonObject.opt("phone");
System.out.println(phone);
boolean optBoolean = jsonObject.optBoolean("phone");
System.out.println(optBoolean);
//optXXX(key,defaultValue): 根据从JSON中获取对应值,若key不存在则返回指定defaultValue作为默认值
boolean optBoolean2 = jsonObject.optBoolean("phone", true);
System.out.println(optBoolean2);
//put(key,value) : 向JSONObject中新增 键值
jsonObject.put("phone", "1310000001");
phone = jsonObject.opt("phone");
System.out.println(phone);
//remove(key) : 删除指定键值
jsonObject.remove("phone");
phone = jsonObject.opt("phone");
System.out.println(phone);
//getJSONArray(key) : 根据key 获取对应的值,且将值转化为JSON数组
}
原生JSON解析
需要导入 json-lib.jar
字符串转化为对象
/**
* @Title: jsonStr
* @author: Mr.T
* @date: 2019年11月6日 上午10:21:05
* @Description: JSON格式的字符串
* @return: void
*/
private static void jsonStr() {
//JSON 对象格式
String json1 = "{name:'张三',age:1}";
//json 数组格式
String json2 = "[{name:'张三',age:1},{name:'李四',age:2}]";
}
/**
* @Title: strToJSON
* @author: Mr.T
* @date: 2019年11月6日 上午10:49:14
* @Description: 字符串转化为JSON ,及JSONObject中核心方法
* @throws Exception
* @return: void
*/
private static void strToJSON() throws Exception {
//JSON 对象格式
String json1 = "{name:'张三',age:1,sex:null}";
//将字符串转化为JSON对象
JSONObject jsonObject = new JSONObject(json1);
// get(name) : 根据指定的key 从 JSON对象中获取对应的值
// getString getBoolean 等等方法都是通过get方法进行数据类型转换
Object name = jsonObject.get("name");
Object age = jsonObject.get("age");
System.out.println(name.toString()+" "+age.toString());
String string = jsonObject.getString("name");
//Object o = jsonObject.get("sex");
// 注意: 当从JSON中根据key获取值时,若没有指定的key,使用get 获取时,会抛异常,表示该JSON没有这个属性.
//has(key) : 判断JSON中是否存在指定的key
boolean flag = jsonObject.has("sex");
System.out.println(flag);
flag = jsonObject.has("name");
System.out.println(flag);
//isNull(key) : 判断指定的key 是否存在或者key对应的值为null
System.out.println(jsonObject.isNull("sex"));
//keys() : 获取所有的key
Iterator keys = jsonObject.keys();
while(keys.hasNext()) {
System.out.println(keys.next());
}
//length : json中元素的个数
System.out.println(jsonObject.length());
//names() : 返回json对象中所有的key
JSONArray names = jsonObject.names();
for(int i=0;i<names.length();i++) {
System.out.println(names.get(i));
}
// 根据key 获取json中的数据 若key不存在则返回默认值
Object phone = jsonObject.opt("phone");
System.out.println(phone);
boolean optBoolean = jsonObject.optBoolean("phone");
System.out.println(optBoolean);
//optXXX(key,defaultValue): 根据从JSON中获取对应值,若key不存在则返回指定defaultValue作为默认值
boolean optBoolean2 = jsonObject.optBoolean("phone", true);
System.out.println(optBoolean2);
//put(key,value) : 向JSONObject中新增 键值
jsonObject.put("phone", "1310000001");
phone = jsonObject.opt("phone");
System.out.println(phone);
//remove(key) : 删除指定键值
jsonObject.remove("phone");
phone = jsonObject.opt("phone");
System.out.println(phone);
//getJSONArray(key) : 根据key 获取对应的值,且将值转化为JSON数组
}
/**
* @Title: strToMap
* @author: Mr.T
* @date: 2019年11月6日 上午10:49:52
* @Description: 将JSON字符串转化为Map数据结构
* @return: void
* @throws Exception
*/
public static void strToMap() throws Exception {
//JSON字符串
String json1 = "{name:'张三',age:1,sex:'男'}";
//将字符串转化为JSON
JSONObject json = new JSONObject(json1);
//将JSON对象转化为Map
Map<String,Object> map = new HashMap<String, Object>();
Iterator keys = json.keys();
while(keys.hasNext()) {
String key = keys.next().toString();
map.put(key, json.get(key));
}
System.out.println(map);
}
/**
* @Title: strToBean
* @author: Mr.T
* @date: 2019年11月6日 上午10:54:16
* @Description: 将字符串转化为Java实体对象
* @throws Exception
* @return: void
*/
public static void strToBean() throws Exception {
//JSON字符串
String json1 = "{name:'张三',age:1,sex:'男'}";
//将字符串转化为JSON
JSONObject json = new JSONObject(json1);
Student st = new Student();
st.setName(json.getString("name"));
st.setAge(json.getInt("age"));
st.setSex(json.getString("sex"));
System.out.println(st);
}
数组字符串转对象
package com.sxt.sun;
import java.util.ArrayList;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONObject;
/**
* @ClassName: JONArrayParseDemo
* @Description: JSON数组解析
* @author: Mr.T
* @date: 2019年11月6日 上午11:19:37
*/
public class JONArrayParseDemo {
public static void main(String[] args) {
try {
//strToJSONArray();
strToBean();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void strToJSONArray() throws Exception {
String jsonArr = "[{name:'张三',age:18,sex:'男'},{name:'李四',age:18,sex:'男'}]";
// 将数组格式JSON,转化为JSONArray
JSONArray arr = new JSONArray(jsonArr);
// length() : 返回数组中元素的个数
int length = arr.length();
System.out.println(length);
//get(index) : 根据下标获取元素
// getXXX 都是通过get(index) 获取元素进行数据类型转换
//put(value) : 向后添加元素
//put(index,value): 修改
//remove(index) : 删除指定下标
}
public static void strToBean() throws Exception {
String str = "{'code':200,'message':'SUCCESS','data':[{'name':'张三','age':18,'sex':'男','like':['篮球','足球']},{'name':'李四','age':18,'sex':'男','like':['篮球','足球']}]}";
JSONObject jsonObject = new JSONObject(str);
JSONArray data = jsonObject.getJSONArray("data");
List<Student> students = new ArrayList<Student>();
for(int i=0;i<data.length();i++) {
//根据下标获取数据
JSONObject obj = data.getJSONObject(i);
Student st = new Student();
st.setName(obj.getString("name"));
st.setAge(obj.getInt("age"));
st.setSex(obj.getString("sex"));
JSONArray jsonArray = obj.getJSONArray("like");
List<String> likes = new ArrayList<String>();
for (int j = 0; j < jsonArray.length(); j++) {
likes.add(jsonArray.getString(j));
}
st.setLike(likes);
students.add(st);
}
System.out.println(students);
}
}
对象转字符串
package com.sxt.sun;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.json.JSONArray;
import org.json.JSONObject;
/**
* @ClassName: ObjectToJsonStr
* @Description: 将对象转化为JSON字符串
* @author: Mr.T
* @date: 2019年11月6日 上午11:41:45
*/
public class ObjectToJsonStr {
public static void main(String[] args) {
//mapToStr();
//beanToStr();
listToStr();
}
/**
* @Title: mapToStr
* @author: Mr.T
* @date: 2019年11月6日 上午11:42:21
* @Description: 将Map转化为json字符串
* @return: void
*/
public static void mapToStr() {
Map<String,Object> map = new HashMap<String, Object>();
map.put("name", "韩梅梅");
map.put("age",18);
map.put("sex", "女");
//将Map转化为JSON对象
JSONObject json = new JSONObject(map);
System.out.println(json.toString());
}
/**
* @Title: beanToStr
* @author: Mr.T
* @date: 2019年11月6日 上午11:44:46
* @Description: 将Java对象转化为JSON字符串
* @return: void
*/
public static void beanToStr() {
List<String> likes = new ArrayList<String>();
likes.add("书法");
likes.add("画画");
Student st = new Student("韩梅梅", 18, "女", likes);
JSONObject json = new JSONObject(st);
System.out.println(json.toString());
}
/**
* @Title: listToStr
* @author: Mr.T
* @date: 2019年11月6日 上午11:48:14
* @Description: 数组转字符串
* @return: void
*/
public static void listToStr() {
List<Student> students = new ArrayList<Student>();
List<String> likes = new ArrayList<String>();
likes.add("书法");
likes.add("画画");
Student st1 = new Student("韩梅梅", 18, "女", likes);
Student st2 = new Student("Lucy", 18, "女", likes);
students.add(st1);
students.add(st2);
JSONArray json = new JSONArray(students);
System.out.println(json.toString());
}
}
阿里-fastJSON解析
需要导入fastjson-XXX.jar
在fastJSON核心方法:
parse(str):将json格式的字符串转化为各种类型。
toJSONString(Object):将各种类型的数据转化为JSON字符串。
package com.sxt.ali;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.sxt.sun.Student;
/**
* @ClassName: FastJSONDemo
* @Description: 阿里的fastJSON解析
* @author: Mr.T
* @date: 2019年11月6日 下午2:18:27
*/
public class FastJSONDemo {
public static void main(String[] args) {
//strToBean();
strToList();
//beanToStr();
//listToStr();
}
// 将字符串转化为Map
// 将字符串转化为JavaBean
/**
* @Title: strToBean
* @author: Mr.T
* @date: 2019年11月6日 下午2:21:44
* @Description: 将字符串转化为map
* @return: void
*/
public static void strToBean() {
String json1 = "{name:'张三',age:1,sex:'男'}";
Student student = JSON.parseObject(json1,Student.class);
System.out.println(student);
}
/**
* @Title: strToList
* @author: Mr.T
* @date: 2019年11月6日 下午2:29:24
* @Description: 将JSON字符串转化为List
* @return: void
*/
public static void strToList() {
String str = "{'code':200,'message':'SUCCESS','data':[{'name':'张三','age':18,'sex':'男','like':['篮球','足球']},{'name':'李四','age':18,'sex':'男','like':['篮球','足球']}]}";
JSONObject parseObject = JSON.parseObject(str);
String string = parseObject.getString("data");
System.out.println(string);
List<Student> sts = JSON.parseArray(string,Student.class);
System.out.println(sts);
}
/**
* @Title: beanToStr
* @author: Mr.T
* @date: 2019年11月6日 下午2:30:32
* @Description: 将对象转化为字符串
* @return: void
*/
public static void beanToStr() {
Student st = new Student("韩梅梅", 18, "女", null);
String str = JSON.toJSONString(st);
System.out.println(str);
}
/**
* @Title: listToStr
* @author: Mr.T
* @date: 2019年11月6日 下午2:32:27
* @Description: 将List转化为字符串
* @return: void
*/
public static void listToStr() {
List<Student> students = new ArrayList<Student>();
List<String> likes = new ArrayList<String>();
likes.add("书法");
likes.add("画画");
Student st1 = new Student("韩梅梅", 18, "女", likes);
Student st2 = new Student("Lucy", 18, "女", likes);
students.add(st1);
students.add(st2);
String str = JSON.toJSONString(students);
System.out.println(str);
}
}
转化思路:
利用JSON中数据格式是Map格式,其中key对应的属性名称,根据key获取值,然后根据传递Class 创建对象,根据key,以及key对应的value对对象属性赋值.
Google-GSON解析
需要导入 gson-XXX.jar
package com.sxt.google;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.sxt.sun.Student;
/**
* @ClassName: GsonDemo
* @Description: 使用 gson进行解析
* @author: Mr.T
* @date: 2019年11月6日 下午2:51:15
*/
public class GsonDemo {
public static void main(String[] args) {
strToBean();
//strToList();
//strToList2();
//beanToStr();
//listToStr();
}
/**
* @Title: strToBean
* @author: Mr.T
* @date: 2019年11月6日 下午2:53:48
* @Description: 将字符串转化为对象
* @return: void
*/
public static void strToBean() {
String json1 = "{name:'张三',age:1,sex:'男'}";
Gson gson = new Gson();
// 将字符串转化为指定的数据类型
Student student = gson.fromJson(json1,Student.class);
System.out.println(student);
}
public static void strToList() {
String str = "['韩梅梅','李磊','Lucy']";// List<String>
Gson gson = new Gson();
List fromJson = gson.fromJson(str, List.class);
System.out.println(fromJson);
}
/**
* @Title: strToList2
* @author: Mr.T
* @date: 2019年11月6日 下午3:00:25
* @Description: TODO
* @return: void
*/
public static void strToList2() {
String str = "[{'name':'张三','age':18,'sex':'男','like':['篮球','足球']},{'name':'李四','age':18,'sex':'男','like':['篮球','足球']}]";
Gson gson = new Gson();
List fromJson = gson.fromJson(str, List.class);
List<Student> students = gson.fromJson(str, new TypeToken<List<Student>>() {}.getType());
System.out.println(fromJson.size());
System.out.println(fromJson);
System.out.println(fromJson.get(0));
System.out.println(students);
}
/**
* @Title: beanToStr
* @author: Mr.T
* @date: 2019年11月6日 下午3:09:23
* @Description: 将对象转化为字符串
* @return: void
*/
public static void beanToStr() {
Student st = new Student("韩梅梅", 18, "女", null);
Gson gson = new Gson();
String json = gson.toJson(st);
System.out.println(json);
}
/**
* @Title: listToStr
* @author: Mr.T
* @date: 2019年11月6日 下午3:10:43
* @Description: 将数组转化为JSON字符串
* @return: void
*/
public static void listToStr() {
List<Student> students = new ArrayList<Student>();
List<String> likes = new ArrayList<String>();
likes.add("书法");
likes.add("画画");
Student st1 = new Student("韩梅梅", 18, "女", likes);
Student st2 = new Student("Lucy", 18, "女", likes);
students.add(st1);
students.add(st2);
Gson gson = new Gson();
System.out.println(gson.toJson(students));
}
}
注意:
1.在fastJson解析中,属性必须要有set方法,且值为null的属性,默认不会解析成字符串。
2.gson解析中,首先创建gson对象,gson解析不依赖set方法。
Ajax
Ajax 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),是指一种创建交互式网页应用的网页开发技术。
Ajax 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。技术应用体现。
Ajax技术,是Javascript利用浏览器的通信功能,实现数据传输和接收服务器响应的数据的一种技术。
XMLHttpRequest
Javascript中一个内置对象,能够利用浏览器发送请求的内置对象.
new XMLHttpRequest();
相关方法:
方法名 | 解释 |
---|---|
open(method,url,async) | method:请求的类型;GET 或 POST url:文件在服务器上的位置 async:true(异步)或 false(同步) |
send(string) | 将请求发送到服务器, string:仅用于 POST 请求 |
setRequestHeader(header,value) | 向请求添加 HTTP 头。 |
相关属性:
属性 | 描述 |
---|---|
responseText | 获得字符串形式的响应数据。 |
responseXML | 获得 XML 形式的响应数据。 |
注意:
ajax的请求其响应的数据只能是字符串.
事件:onreadystatechange:当状态发生变更时触发的方法
属性 | 描述 |
---|---|
onreadystatechange | 存储函数(或函数名),每当 readyState 属性改变时,就会调用该函数。 |
readyState | 存有 XMLHttpRequest 的状态。从 0 到 4 发生变化。0: 请求未初始化1: 服务器连接已建立2: 请求已接收3: 请求处理中4: 请求已完成,且响应已就绪 |
status | 200: "OK"404: 未找到页面 |
Ajax步骤
- 创建请求对象
- 建立连接
- 发送请求
- 监听请求对象的状态
- 当状态为200且响应完成
原生Ajax例子
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Ajax</title>
</head>
<body>
<button onclick="btn()" class="layui-btn">点击我</button>
<span id="msg"></span>
<script>
function btn() {
// 创建一个Http请求的对象
var httpRequest = new XMLHttpRequest();
// 监听httpRequest状态
httpRequest.onreadystatechange = function () {
// 如果就绪状态为4 且 请求状态码为200则执行
if (httpRequest.readyState == 4 && httpRequest.status == 200) {
document.getElementById("msg").innerText = httpRequest.responseText;
}
}
// 创建连接
httpRequest.open("get", "demo.do", true);
// 发送请求
httpRequest.send();
//获取响应信息 必须在响应完成 且 状态码200时才有
}
</script>
</body>
</html>
注意:
ajax: 浏览器安全策略: 同源安全策略.
浏览器异常:
Access to XMLHttpRequest at 'http://127.0.0.1:8080/08ajax/test.do' from origin 'http://localhost:8080' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
jQuery中的Ajax
jquery中的方法
函数 | 描述 |
---|---|
jQuery.ajax() | 执行异步 HTTP (Ajax) 请求。 |
.ajaxComplete() | 当 Ajax 请求完成时注册要调用的处理程序。这是一个 Ajax 事件。 |
.ajaxError() | 当 Ajax 请求完成且出现错误时注册要调用的处理程序。这是一个 Ajax 事件。 |
.ajaxSend() | 在 Ajax 请求发送之前显示一条消息。 |
jQuery.ajaxSetup() | 设置将来的 Ajax 请求的默认值。 |
.ajaxStart() | 当首个 Ajax 请求完成开始时注册要调用的处理程序。这是一个 Ajax 事件。 |
.ajaxStop() | 当所有 Ajax 请求完成时注册要调用的处理程序。这是一个 Ajax 事件。 |
.ajaxSuccess() | 当 Ajax 请求成功完成时显示一条消息。 |
jQuery.get() | 使用 HTTP GET 请求从服务器加载数据。 |
jQuery.getJSON() | 使用 HTTP GET 请求从服务器加载 JSON 编码数据。 |
jQuery.getScript() | 使用 HTTP GET 请求从服务器加载 JavaScript 文件,然后执行该文件。 |
.load() | 从服务器加载数据,然后把返回到 HTML 放入匹配元素。 |
jQuery.param() | 创建数组或对象的序列化表示,适合在 URL 查询字符串或 Ajax 请求中使用。 |
jQuery.post() | 使用 HTTP POST 请求从服务器加载数据。 |
.serialize() | 将表单内容序列化为字符串。 |
.serializeArray() | 序列化表单元素,返回 JSON 数据结构数据。 |
ajax方法
$.ajax(option);
option属性
属性名 | 类型 | 属性解释 |
---|---|---|
url | String | 请求地址 |
type | String | 请求方法:get post,默认是get |
async | boolean | true 异步 false 同步 默认是true |
data | Object | 提交的数据 |
dataType | String | 预期服务器返回的数据类型 |
success | function | 请求成功后的回调函数 |
error | function | 在请求出错时调用函数 |
complete | function | 当请求完成之后调用这个函数,无论成功或失败 |
beforeSend | function | 在发送请求之前调用 |
timeout | Number | 设置请求超时时间(毫秒) |
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<img src="img/loading.gif" id="loading" style="display: none;" />
<button onclick="sendAJAX()">点击我</button>
<script type="text/javascript" src="js/jquery.js"></script>
<script type="text/javascript">
function sendAJAX(){
var m = 10
$.ajax({
//ajax请求的资质
url:"http://127.0.0.1:8080/08ajax/test.do",
type:"get",// 默认是get请求 请求方式
async:true,// 是否异步 默认 true 异步 若是异步,ajax没有完全执行完时,其后面的代码可以接着执行,但是若是同步,只有等ajax执行完,其后面代码才能执行.
//若ajax中存在变量参与后面代码的运算,一般将ajax设置为同步.
data:{name:'张三','age':18},//请求的数据
//dataType:"json",//期望的返回的数据类型
success:function(rs){
m = m + rs;
console.log(rs);
},
error:function(xhr,textStatus){// 请求地址错误时 会触发,当服务器内部异常时也会执行error,只要HTTP请求不是200,就会执行error
console.log(xhr);
console.log("error:"+textStatus);
},
complete:function(){//请求完成执行,不管成功还是失败都会执行
console.log("complete:function");
$("#loading").hide();
},
timeout:2000, // 请求超时的时间 单位是 毫秒
beforeSend:function(){
console.log("beforeSend:function");
$("#loading").show();
}
});
//耗时操作
//for(var i =0;i<10000000000;i++){}
//打印m
console.log(m);
}
</script>
</body>
</html>
$.post: 只支持post请求
语法:
$.post(URL,data,callback);
注意:只支持post请求,并且其默认配置都是使用ajax请求的默认值
参数 | 解释 |
---|---|
URL | 请求的地址 |
data | 请求的数据 |
callback | 请求完成后回调的函数 |
$.get
语法:
$.get(URL,data,callback);
注意:只支持get请求,并且其默认配置都是使用ajax请求的默认值
参数 | 解释 |
---|---|
URL | 请求的地址 |
data | 请求的数据 |
callback | 请求完成后回调的函数 |
// $.post 示例
function sendPost(){
var data = {};
data.name = "张三";
data.age = 18;
$.post("http://127.0.0.1:8080/08ajax/test.do",data,function(rs){
console.log(rs);
// 将字符串转化为JSON
rs = JSON.parse(rs);
// 将对象转化为json字符串
rs = JSON.stringify(rs);
console.log(rs.age);
});
}
function sendGet(){
var data = {};
data.name = "张三";
data.age = 18;
$.post("http://127.0.0.1:8080/08ajax/test.do",data,function(rs){
console.log(rs);
});
}