数据交换-JSON
JSON介绍
- JSON指的是JavaScript对象表示法(JavaScript Object Notation)
- JSON是轻量级的文本数据交换格式
- JSON独立于语言【即 java . php、asp.net等都可以使用JSON】
- JSON具有自我描述性,更易理解
数据交换格式:浏览器向tomcat发送http请求,为了让程序更好的获得请求中的数据,会按照JSON格式来发送。tomcat在处理完数据,会给浏览器返回一个响应,当然为了浏览器更好的得到响应携带的数据,也会按照JSON格式来发送
解读JSON规则
- 映射(元素/属性)用冒号∶表示,
"名称":值
,注意名称是字符串,因此要用双引号引起来 - 并列的数据之间用逗号,分隔。
"名称1":值,"名称2":值
- 映射的集合(对象)用大括号{表示。
{"名称1":值,"名称2":值}
. 两边是{}
是json对象 - 并列数据的集合(数组)用方括号
[]
表示。[{"名称1":值,"名称2":值},{"名称1";:值,"名称2";值}]
.两边是[]
是json数组 - 元素值类型: string, number, object, array, true, false, null
JSON与字符串互转
JSON.stringify(json)
功能:将一个json对象转换成为json字符串JSON.parse(jsonString)
功能:将一个json字符串转换成为json对象
JSON转换为字符串
<script type="text/javascript">
window.onload = function () {
var jsonPerson = {
"name": "jack",
"age": 20
}
var strPerson = JSON.stringify(jsonPerson);
}
</script>
字符串转换为JSON
<script type="text/javascript">
window.onload = function () {
//字符串转为json对象
//注意要转成json对象的string格式必须满足json格式
var strDog = "{\"name\":\"jack\",\"age\":20}";
var jsonDog = JSON.parse(strDog);
}
</script>
JSON与字符串互相转换细节
- JSON.springify(json对象)会返回对应string,并不会影响原来json对象
- JSON.parse(string)函数会返回对应的json对象,并不会影响原来string
- 在定义Json对象时,可以使用
' '
表示字符串
比如var json_person = "name": "jack", "age": 100};
也可以写成var json_person = 'name': 'jack', 'age': 100};
- 但是在把原生字符串转成json对象时,必须使用
" "
,否则会报错
比如:var str_dog = "{'name':'小黄狗', 'age': 4";
转json就会报错 - JSON.springify(json对象)返回的字符串,都是
" "
表示的字符串,所以在语法格式正确的情况下,是可以重新转成json对象的
JSON在Java中的使用
前端将JSON字符串发送给后端-->
后端接收到JSON字符串后-->
需要转换成Java对象(Javabean、List、map)进行处理
将处理完的Java对象-->
转换为JSON字符串-->
发送给前端
- java中使用json,需要引入到第3方的包gson.jar
- Gson是Google提供的用来在Java对象和JSON 数据之间进行映射的Java类库。
- 可以对JSON字符串和Java对象相互转换
gson.toJson(Java对象)
:Java对象(JavaBean、List对象、Map对象)转换成Json字符串
gson.fromJson(json字符串, Java对象的class对象)
:json字符串转换成Java对象
Java对象的class对象
:如果是JavaBean,可以JavaBean.class。但如果是是比较复杂的对象,就需要使用new TypeToken<Java对象类型>() {}.getType();
来获取对应的class对象
Java对象与JSON字符串互相转换
public class JavaBean {
public static void main(String[] args) {
//创建一个gson对象,做完一个工具对象使用
Gson gson = new Gson();
Book book = new Book(10, "快乐学Java");
//演示把JavaBean -> json对象
String strBook = gson.toJson(book);
//json字符串 -> JavaBean
//(1) strBook就是json字符串
//(2) Book.class指定将json字符串转成Book对象
//(3)底层是反射机制
Book book2 = gson.fromJson(strBook, Book.class);
}
}
List对象与JSON字符串转换
public class JavaBean {
public static void main(String[] args) {
//3. 演示把list对象 -> json字符串
ArrayList<Book> bookList = new ArrayList<>();
bookList.add(new Book(20,"三国演义"));
bookList.add(new Book(30,"红楼梦"));
//演示把list对象 -> json字符串
String strBookList = gson.toJson(bookList);
//演示把json字符串 -> list对象
Type type = new TypeToken<List<Book>>() {}.getType();
Object bookList2 = gson.fromJson(strBookList, type);
}
}
new TypeToken<List<Book>>() {}.getType();
- 如果需要把json字符串 转成 集合这样复杂的类型, 就需要
TypeToken
TypeToken
, 是一个自定义泛型类, 然后通过TypeToken来获取指定的类型的绝对路径(反射需要通过类的绝对路径来创建实例)
为什么要在new TypeToken<List<Book>>()
后面加上 {}
- TypeToken的无参构造是protected修饰(只有 同类、同包、子类可以访问),因此如果
TypeToken<List<Book>>()
这样写,是不会创建成功的 - 而
new TypeToken<List<Book>>(){}
的意思:创建一个继承了TypeToken的匿名类部类-->
前面的()
是调用该匿名类部类的无参构造-->
无参构造前面默认有一个super();
-->
最终调用TypeToken的无参构造(protected:子类是可以访问的)-->
创建成功
Map对象与JSON字符串转换
public class JavaBean {
public static void main(String[] args) {
Map<String, Book> mapBook = new HashMap<>();
mapBook.put("20", new Book(50, "水浒传"));
mapBook.put("30", new Book(60, "西游记"));
//演示把map对象转换成json字符串
String strBookMap = gson.toJson(mapBook);
//演示把json字符串转换成map对象
Map<String, Book> JsonBookMap = gson.fromJson(strBookMap, new TypeToken<Map<String, Book>>() {}.getType());
}
}
JSON介绍
数据交换格式:浏览器向tomcat发送http请求,为了让程序更好的获得请求中的数据,会按照JSON格式来发送。tomcat在处理完数据,会给浏览器返回一个响应,当然为了浏览器更好的得到响应携带的数据,也会按照JSON格式来发送
JSON因为处理数据非常方便,已经成为前后端交互的通用的数据格式
JSON使用
JSON数据都是以 "k-v"的形式来保存
解读JSON规则
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>json 快速入门案例</title>
<script type="text/javascript">
window.onload = function () {
var myJson = {
"key1": "我是字符串", // 字符串
"key2": 123, // Number
"key3": [1, "hello", 2.3], // 数组
"key4": {"age": 12, "name": "jack"}, //json对象
"key5": [ //json数组 //json数组保存的数据类型是可以不相同的
{"k1": 10, "k2": "milan"},
{"k3": 30, "k4": "smith"},
]
};
//1.取出k1
console.log("key1=", myJson.key1);
//2.取出k3
console.log("key3=", myJson.key3);
// 可以对key3取出的值(Array),遍历
for (var i = 0; i < myJson.key3.length; i++) {
console.log("第%i个元素的值=", i, myJson.key3[i]);
}
//3.取出key4
console.log("key4=" ,myJson.key4 , " name=" ,myJson.key4.name);
//4.取出key5
console.log("key5=",myJson.key5, " k4=" , myJson.key5[1].k4);
}
</script>
</head>
<body>
<h1>json 快速入门案例</h1>
</body>
</html>
JSON转字符串
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JSON对象和字符串对象转换</title>
<script type="text/javascript">
window.onload = function () {
//解读JSON
//1.JSON是一个js的内置对象(build-in),可以直接使用
console.log("JSON=", JSON);
var jsonPerson = {
"name": "jack",
"age": 20
}
console.log("jsonPerson=" ,jsonPerson);
//演示如何将以json对象->string
var strPerson = JSON.stringify(jsonPerson);
console.log("strPerson=" ,strPerson , "strPerson类型" ,typeof strPerson);
}
</script>
</head>
<body>
<h1>JSON对象和字符串对象转换</h1>
</body>
</html>
字符串转JSON
注意要转成json对象的string格式必须满足json格式
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JSON对象和字符串对象转换</title>
<script type="text/javascript">
window.onload = function () {
//字符串转为json对象
//注意要转成json对象的string格式必须满足json格式
var strDog = "{\"name\":\"jack\",\"age\":20}";
var jsonDog = JSON.parse(strDog);
console.log("jsonDog=", jsonDog, "jsonDog类型=", typeof jsonDog);
}
</script>
</head>
<body>
<h1>JSON对象和字符串对象转换</h1>
</body>
</html>
如果不是JSON格式,会报错
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JSON对象和字符串对象转换</title>
<script type="text/javascript">
window.onload = function () {
var strCat = "{\"123\"}";
var jsonCat = JSON.parse(strCat);
}
</script>
</head>
<body>
<h1>JSON对象和字符串对象转换</h1>
</body>
</html>
JSON与字符串互相转换细节
1.JSON.springify(json对象)
会返回对应string, 并不会影响原来json对象
<script type="text/javascript">
//1. JSON.springify(json对象) 会返回对应string, 并不会影响原来json对象
var jsonPerson = {
"name": "jack",
"age": 20
}
var strPerson = JSON.stringify(jsonPerson);
console.log("jsonPerson类型=" , typeof jsonPerson);
console.log("strPerson类型=" , typeof strPerson);
</script>
2. JSON.parse(string)
函数会返回对应的json对象, 并不会影响原来string
<script type="text/javascript">
//2. JSON.parse(string) 函数会返回对应的json对象, 并不会影响原来string
var strDog = "{\"name\":\"小黄狗\", \"age\":2}";
var jsonDog = JSON.parse(strDog);
console.log("strDog类型=" , typeof strDog);
console.log("jsonDog类型=" , typeof jsonDog);
</script>
3.在定义Json对象时, 可以使用 ' '
表示字符串
不加 ' '
和 " "
也是可行的,但是为了规范,建议还是加上 " "
<script type="text/javascript">
var jsonCat = {
'name': '小黑',
'age': 3
}
var strCat = JSON.stringify(jsonCat);
console.log("strCat=" , strCat);
</script>
4.但是在把原生字符串转成 json对象时, 必须使用 " "
, 否则会报错 比如
<script type="text/javascript">
//4. 但是在把原生字符串转成 json对象时, 必须使用 "", 否则会报错 比如
var strFish = "{'name':'小青鱼', 'age':3}"; //不加单引号也不行
var JSONFish = JSON.parse(strFish);
console.log("JSONFish=", JSONFish);
</script>
<script type="text/javascript">
var strFish = "{\"name\":\"小青鱼\", \"age\":3}";
var JSONFish = JSON.parse(strFish);
console.log("JSONFish=", JSONFish);
</script>
5.JSON.springify(json对象) 返回的字符串,可以重新转回JSON对象
<script type="text/javascript">
//5. JSON.springify(json对象) 返回的字符串, 都是 "" 表示的字符串
var strPerson2 = JSON.stringify(jsonPerson);
var parse = JSON.parse(strPerson2);
console.log("parse=", parse);
</script>
JSON在Java中的使用
前端将JSON字符串发送给后端-->
后端接收到JSON字符串后-->
需要转换成Java对象(Javabean、List、map)进行处理
将处理完的Java对象->
转换为JSON字符串-->
发送给前端
Java对象与JSON字符串互相转换
package com.study.json;
import com.google.gson.Gson;
/**
* @author 珀筱
*/
@SuppressWarnings({"all"})
public class JavaBean {
public static void main(String[] args) {
//创建一个gson对象,做完一个工具对象使用
Gson gson = new Gson();
//演示javaBean和json字符串的转换
Book book = new Book(10, "快乐学Java");
//1.演示把JavaBean -> json对象
String strBook = gson.toJson(book);
System.out.println("strBook=" + strBook);
//2.json字符串 -> JavaBean
//(1) strBook就是json字符串
//(2) Book.class指定将json字符串转成Book对象
//(3)底层是反射机制
Book book2 = gson.fromJson(strBook, Book.class);
System.out.println("book2=" + book2);
}
}
List对象与JSON字符串转换
package com.study.json;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
/**
* @author 珀筱
*/
@SuppressWarnings({"all"})
public class JavaBean {
public static void main(String[] args) {
//创建一个gson对象,做完一个工具对象使用
Gson gson = new Gson();
//演示javaBean和json字符串的转换
Book book = new Book(10, "快乐学Java");
//3. 演示把list对象 -> json字符串
ArrayList<Book> bookList = new ArrayList<>();
bookList.add(new Book(20,"三国演义"));
bookList.add(new Book(30,"红楼梦"));
//底层只需要遍历, 按照json格式拼接返回即可
String strBookList = gson.toJson(bookList);
System.out.println(strBookList);
//4. 演示把json字符串 -> list对象
//(1) 如果需要把json字符串 转成 集合这样复杂的类型, 需要使用gson提供的一个类
//(2) TypeToken , 是一个自定义泛型类, 然后通过TypeToken来指定我们需要转换成的类型
/*
package com.google.gson.reflect;
public class TypeToken<T> {
final Class<? super T> rawType;
final Type type;
final int hashCode;
*/
//(1) 返回类型的完整路径java.util.List<com.hspedu.json.Book>
//(2) gson的设计者,需要得到类型的完整路径,然后进行底层反射
//(3) 所以gson 设计者就提供TypeToken, 来搞定.
//后面的类型为什么不能直接写List<book>,因为一个包下可能包含多个List和book
// 但反射就需要一个确定的地址来创建实例,因此需要显示 提供的TypeToken来获得类型的绝对路径
//(1) 如果我们 new TypeToken<List<Book>>() 提示
// 'TypeToken()' has protected access in 'com.google.gson.reflect.TypeToken' (无参构造器是受保护,不能访问)
//(2) 因为TypeToken 的无参构造器是protected , 而 new TypeToken<List<Book>>() 就是调用其无参构造器
//(3) 根据java基础, 如果一个方法是protected ,而且不在同一个包, 是不能直接访问的, 因此报错
//(4) new TypeToken<List<Book>>(){} 这是创建一个匿名类部类(继承了TypeToken的子类),
// 后面()相当于调用了匿名类部类对象的无参构造器,而无参构造器最前有super()方法,便又会去调用TypeToken的无参构造器
// protected类型是允许子类访问,因此可以创建成功
//(5) 当 new TypeToken<List<Book>>(){} 其实这个类型就是不是 TypeToken 而是一个匿名内部类(子类)
//(6) 而且这个匿名内部类是有自己的无参构造器(隐式), 根据java基础规则 当执行子类的无参构造器时, 默认super();
Type type = new TypeToken<List<Book>>() {}.getType();
Object bookList2 = gson.fromJson(strBookList, type);
System.out.println("bookList2=" + bookList2);
}
}
Map对象与JSON字符串转换
package com.study.json;
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;
/**
* @author 珀筱
*/
@SuppressWarnings({"all"})
public class JavaBean {
public static void main(String[] args) {
//创建一个gson对象,做完一个工具对象使用
Gson gson = new Gson();
//演示javaBean和json字符串的转换
Book book = new Book(10, "快乐学Java");
//5. 演示把map对象转换成json字符串
Map<String, Book> mapBook = new HashMap<>();
mapBook.put("20", new Book(50, "水浒传"));
mapBook.put("30", new Book(60, "西游记"));
String strBookMap = gson.toJson(mapBook);
System.out.println(strBookMap);
//6. 演示把json字符串转换成map对象
Map<String, Book> JsonBookMap = gson.fromJson(strBookMap, new TypeToken<Map<String, Book>>() {}.getType());
System.out.println(JsonBookMap);
}
}