目录
-
JSON的定义
-
JSON由键值对组成,并且由花括号({})包围。
-
每个键由引号引起来,键和值之间使用冒号进行分隔,多组键值对之间使用逗号分隔
-
下面分别是int、字符串、布尔类型、数组、集合、JSON数组在JSON中的定义
-
var jsonObj = {
"key1" : 12,
"key2" : "abc",
"key3" : true,
"key4" : [11, "arr", false],
"key5" : {
"key5_1" : 551,
"key5_2" : "key5_2_value"
},
"key6" : [{
"key6_1_1" : 6611,
"key6_6_2" : "key6_1_2_value"
},{
"key6_2_1" : 6621,
"key6_2_2" : "key6_2_2_value"
}]
};
-
JSON的访问
-
JSON本身是一个对象
-
JSON中的key可以理解为是对象中的一个属性
-
JSON中的key访问就跟访问对象的属性一样:json对象.key
-
alert(jsonObj.key1); // 12
alert(jsonObj.key2); // abc
alert(jsonObj.key3); // true
alert(jsonObj.key4); // 11,arr,false
alert(jsonObj.key5); // [object Object]
alert(jsonObj.key6); // [object Object],[object Object]
// 遍历数组
for (var i = 0; i < jsonObj.key4.length; i++) {
alert(jsonObj.key4[i]); // 11;arr;false
}
// 访问集合中的元素
alert(jsonObj.key5.key5_1); // 551
// 访问JSON中的JSON
var jsonItem = jsonObj.key6[0]; // 先取出JSON中JSON数组的第一个元素(JSON类型的)
alert( jsonItem.key6_1_1 ); // 再输出 6611
-
JSON的两种存在形式
-
形式1:以对象的形式存在,称之为json对象
-
形式2:以字符串的形式存在,称之为json字符串
-
使用何种形式:
-
一般我们要操作JSON中的数据的时候,需要JSON对象的格式
-
一般我们要在客户端和服务器之间进行数据交换的时候,使用JSON字符串
-
-
-
JSON两个常用方法
-
JSON.stringify( json对象 )
-
把json对象转化为json字符串
-
-
JSON.parse( json字符串 )
-
把json字符串转化为json对象
-
-
// 将json对象转换为json字符串
var jsonObjString = JSON.stringify(jsonObj);
// 把json字符串转换为json对象
var jsonObj2 = JSON.parse(jsonObjString);
-
JSON在Java中的使用
-
需要gson-2.2.4.jar(谷歌提供)或者其他jar包
-
两个方法
-
toJson()方法:可以把Java对象转换为json字符串
-
fromJson()方法:可以把json字符串转变为Java对象
-
-
三种情况
-
javaBean和JSON的互转
-
List和JSON的互转
-
Map和JSON的互转
-
-
代码展示
-
javaBean和JSON的互转
-
-
// 1、javaBean和JSON的互转
@Test
public void test1(){
// 创建一个Java对象
Person person = new Person(1, "凌晨一点半");
// 创建Gson对象实例
Gson gson = new Gson();
// 转-->:toJson()方法可以把Java对象转换为json字符串
String persinJsonString = gson.toJson(person);
// 转<--:fromJson()方法可以把json字符串转变为Java对象
// 参数1:json字符串; 参数2:转换回去的Java对象的类型(需要.class)
Person person1 = gson.fromJson(persinJsonString, Person.class);
}
-
List和JSON的互转
// 2、List和JSON的互转
@Test
public void test2() {
// 创建一个List
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);
// 转<--:把json字符串转换为List
// List list = gson.fromJson(personListJsonString, personList.getClass());// 这样转会失败,所得到的不是List
// 写一个类继承TypeToken类,第二个参数创建一个该类的对象,再调用getType()转换类型
// List list = gson.fromJson(personListJsonString, new PersonListType().getType());
// 使用匿名类可以不用写一个类来继承TypeToken类
List<Person> list = gson.fromJson(personListJsonString, new TypeToken<List<Person>>(){}.getType());
}
public class PersonListType extends TypeToken<ArrayList<Person>> {
// 需要指定泛型,泛型的类型就是json字符串转换为List时的类型
// 什么都不用干,只需要设置好泛型类型就可以了
}
-
Map和JSON的互转
// 3、Map和JSON的互转
@Test
public void test3(){
// 创建一个Map
Map<Integer, Person> personMap = new HashMap<>();
personMap.put(1, new Person(1, "凌晨2点整"));
personMap.put(2, new Person(2, "凌晨2点零一分"));
// 创建一个Gsom实例
Gson gson = new Gson();
// 转-->:map转换为json字符串
String personMapJsonString = gson.toJson(personMap);
// 转<--:json字符串转换为map
// 写一个类继承TypeToken类,第二个参数创建一个该类的对象,再调用getType()转换类型
// Map<Integer, Person> map = gson.fromJson(personMapJsonString, new PersonMapType().getType());
public class PersonMapType extends TypeToken<HashMap<Integer, Person>> {
// 需要指定泛型,泛型的类型就是json字符串转换为Map时的类型
// 什么都不用干,只需要设置好泛型类型就可以了
}
-
使用匿名内部类省掉TypeToken类的继承类
-
// 使用匿名内部类可以不用写类来继承TypeToken类 Map<Integer, Person> map = gson.fromJson(personMapJsonString, new TypeToken<HashMap<Integer,Person>>(){}.getType()); }