JavaWeb学习总结(十六)JSON
一、概述
- JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。JSON 采用完全独立于语言的文本格式,而且很多语言都提供了对 JSON 的支持(包括 C, C++, C#, Java, JavaScript, Perl, Python 等)。 这样就使得 JSON 成为理想的数据交换格式。
- 轻量级指的是跟 xml 做比较。
- 数据交换指的是客户端和服务器之间业务数据的传递
二、JSON在JavaScript中的使用
(一)JSON的定义
在标准的 json 格式中,json 对象由大括号括起来,json 是由键值对组成,每个键由双引号引起来,键和值之间使用冒号进行分隔, 多组键值对之间进行逗号进行分隔。
格式:
var 变量名 = {
"key" : value , // Number 类型
"key2" : "value" , // 字符串类型
"key3" : [] , // 数组类型
"key4" : {} , // json 对象类型
"key5" : [{},{}] // json 数组
};
案例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript">
// json的定义
var jsonObj = {
"key1":12,
"key2":"abc",
"key3":true,
"key4":[11,"abcd",false],
"key5":{
"key5_1" : 551,
"key5_2" : "key5_2_value"
},
"key6":[{
"key6_1_1":6611,
"key6_1_2":"key6_1_2_value"
},{
"key6_2_1":6621,
"key6_2_2":"key6_2_2_value"
}]
};
</script>
</head>
<body>
</body>
</html>
(二)JSON的访问
- json 本身是一个对象。
- json 中的 key 我们可以理解为是对象中的一个属性。
- json 中的 key 访问就跟访问对象的属性一样: json 对象.key
案例:
接上面
alert(typeof(jsonObj));// object json 就是一个对象
alert(jsonObj.key1); //12
alert(jsonObj.key2); // abc
alert(jsonObj.key3); // true
alert(jsonObj.key4);// 得到数组[11,"abcd",false]
// json 中 数组值的遍历
for(var i = 0; i < jsonObj.key4.length; i++) {
alert(jsonObj.key4[i]);
}
alert(jsonObj.key5.key5_1);//551
alert(jsonObj.key5.key5_2);//key5_2_value
alert( jsonObj.key6 );// 得到 json 数组
// 取出来每一个元素都是 json 对象
var jsonItem = jsonObj.key6[0];
alert( jsonItem.key6_1_1 ); //6611
alert( jsonItem.key6_1_2 ); //key6_1_2_value
(三)JSON的两个常用方法
- json 的存在有两种形式。 一种是以对象的形式存在,我们叫它 json 对象。 一种是以字符串的形式存在,我们叫它 json 字符串。
- 一般我们要操作 json 中的数据的时候,需要 json 对象的格式。
- 一般我们要在客户端和服务器之间进行数据交换的时候,使用 json 字符串。
- JSON 对象和字符串对象的互转
-
JSON.stringify( json )
把 json 对象转换成为 json 字符串 -
JSON.parse( jsonString )
把 json 字符串转换成为 json 对象
案例:
接上面
// 把json对象转换成为 json字符串
var jsonObjString = JSON.stringify(jsonObj); // 特别像 Java对象中的 toString方法
alert(jsonObjString);
// 把json字符串。转换成为json对象
var jsonObj2 = JSON.parse(jsonObjString);
alert(jsonObj2.key1);// 12
alert(jsonObj2.key2);// abc
三、JSON在 JAVA 中的使用
(一)第三方类库
Java中并没有内置JSON的解析,因此使用JSON需要借助第三方类库。
下面是几个常用的 JSON 解析类库:
- Gson: 谷歌开发的 JSON 库,功能十分全面。(Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库。可以将一个 JSON 字符串转换成一个 Java 对象,或者反过来)
- FastJson: 阿里巴巴开发的 JSON 库,性能十分优秀。
- Jackson: 社区十分活跃且更新速度很快。
本文采用Gson,可以去Maven仓库下载 gson.jar,并复制进web工程里,然后Add as library
(二)javaBean 和 json 的互转
Person类:
public class Person {
private Integer id;
private String name;
public Person() {
}
public Person(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 "Person{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
测试类:
import com.fox.bean.Person;
import com.google.gson.Gson;
public class JsonTest {
public static void main(String[] args) {
Person person = new Person(1, "小明");
// 创建Gson对象实例
Gson gson = new Gson();
// toJson方法可以把java对象转换成为json字符串
String personJsonString = gson.toJson(person);
System.out.println(personJsonString);
// fromJson把json字符串转换回Java对象
// 第一个参数是json字符串
// 第二个参数是转换回去的Java对象类型
Person person1 = gson.fromJson(personJsonString, Person.class);
System.out.println(person1);
}
}
(三)List 和 json 的互转
- 当json字符串要转换回的对象是javabean,就可以用
fromJson(String s,Class<T> classOfT)
- 当json字符串要转换回的对象是参数化类型(List或Map)就用
fromJson(String s,Type typeOfT)
在我们导入的gson.jar包中给我们提供了一个TypeToken类(TypeToken 是google提供的一个解析Json数据的类库中一个类)
案例:
- 方法一:
只要将需要获取类型的泛型类作为TypeToken的泛型参数创建一个TypeToken的子类,就可以通过该子类的对象的getType()方法获取到我们使用的泛型类的泛型参数类型,即fromJson的第二个参数,举例如下:
创建一个TypeToken的子类:
import com.fox.bean.Person;
import com.google.gson.reflect.TypeToken;
import java.util.ArrayList;
public class PersonListType extends TypeToken<ArrayList<Person>> {//需要获取类型的泛型类作为TypeToken的泛型参数
}
测试类:
import com.fox.bean.Person;
import com.google.gson.Gson;
import java.util.ArrayList;
import java.util.List;
public class JsonTest {
public static void main(String[] args) {
List<Person> personList = new ArrayList<>();
personList.add(new Person(1, "小明"));
personList.add(new Person(2, "小红"));
// 创建Gson对象实例
Gson gson = new Gson();
// 把List转换为json字符串
String personListJsonString = gson.toJson(personList);
System.out.println(personListJsonString);
// fromJson把json字符串转换回List
List<Person> list = gson.fromJson(personListJsonString,new PersonListType().getType());
System.out.println(list);
Person person = list.get(0);
System.out.println(person);
}
}
- 方法二:
方法一创建子类的方式很麻烦,我们其实也可以用匿名内部类的方法:
只要将需要获取类型的泛型类作为TypeToken的泛型参数构造一个匿名的子类,就可以通过getType()方法获取到我们使用的泛型类的泛型参数类型,即fromJson的第二个参数,举例如下:
import com.fox.bean.Person;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.util.ArrayList;
import java.util.List;
public class JsonTest {
public static void main(String[] args) {
List<Person> personList = new ArrayList<>();
personList.add(new Person(1, "小明"));
personList.add(new Person(2, "小红"));
// 创建Gson对象实例
Gson gson = new Gson();
// 把List转换为json字符串
String personListJsonString = gson.toJson(personList);
System.out.println(personListJsonString);
// fromJson把json字符串转换回List
List<Person> list = gson.fromJson(personListJsonString, new TypeToken<List<Person>>() {}.getType());
System.out.println(list);
Person person = list.get(0);
System.out.println(person);
}
}
(四)Map 和 json 的互转
与List和json互转类似。
案例:
import com.fox.bean.Person;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.util.HashMap;
import java.util.Map;
public class JsonTest {
public static void main(String[] args) {
Map<Integer,Person> personMap = new HashMap<>();
personMap.put(1, new Person(1, "小明"));
personMap.put(2, new Person(2, "小红"));
// 创建Gson对象实例
Gson gson = new Gson();
// 把 Map 集合转换成为 json字符串
String personMapJsonString = gson.toJson(personMap);
System.out.println(personMapJsonString);
// fromJson把json字符串转换回Map集合
Map<Integer,Person> personMap2 = gson.fromJson(personMapJsonString, new TypeToken<HashMap<Integer,Person>>(){}.getType());
System.out.println(personMap2);
Person p = personMap2.get(1);
System.out.println(p);
}
}