文章目录
JSON
JSON(JavaSrcipt Object Notation)是一种轻量级的数据交换格式。易于人阅读和编写,同时也易于机器解析和生成。JSON采用完完全独立于语言的文本格式,而且很多语言都提供了对json的支持(包括C++等),这使得JSON成为理想的数据交换语言。
json是一种轻量级的数据交换格式
- 轻量级是跟xml做比较
- 数据交换指的是客户端和服务器之间业务数据传递格式
JSON在JavaScript中的使用
json的定义
定义规范:json是由键值对组成,并且由{}
包围,每个键由""
引号连起来,键和值之间使用:
分割,多组键值对之间使用,
进行分割
在html页面中安如下方式写
<script type="text/javascript">
// json的定义
var jsonObj = {
"key1":12, // 数值
"key2":"abc", // 字符串
"key3":true, // 布尔类型
"key4":[11, "arr", false], // 数组
"key5":{ // json类型
"key6_1":551, // 一个json中元素中的第一个json元素
"key5_2":"key5_2_value" // 一个json中的第二个json元素
},
"key6":[{ // json数组,数组中有两个json元素,每个json元素中又包含两个json
"key6_1_1":6611,
"key6_1_2":6612
},{
"key6_2_1":6621,
"key6_2_2":6622
}]
};
alert(typeof(jsonObj));// object json就是一个对象
</script>
json就是一些列键值对,值可以是任意数值类型。每个json都是一个对象。
json的访问
上文提到每个json都是一个object
类型,二每一个key
值都是对象的一个属性,因此json中key
的访问就跟访问对象的属性一样采用.
来访问,具体如下:
alert(jsonObj.key1); //12
alert(jsonObj.key2); // abc
alert(jsonObj.key3); // true
alert(jsonObj.key4);// 得到数组[11,"arr",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
var jsonItem = jsonObj.key6[0];
alert( jsonItem.key6_1_1 ); //6611
alert( jsonItem.key6_1_2 ); //6612
json的成员方法
json的存在又两种形式(可以相互转换)
- 对象的存在,称其为json对象。一般在需要操作json数据的时候使用
- 字符串的形式存在,称其为json字符串,一般在客户端和服务端之间进行数据交换时使用
转换方法:
JSON.stringify()
:把json对象转换为json字符串JSON.parse()
:把json字符串转换为json对象
// json对象转字符串
// 把json对象转换成为 json字符串
var jsonstringify = JSON.stringify(jsonObj);// 特别像 Java中对象的toString
alert(jsonstringify);
// json字符串转json对象
// 把json字符串。转换成为json对象
var jsonObj2 = JSON.parse(jsonstringify);
alert(jsonObj2);
alert(jsonObj2.key1);// 12
alert(jsonObj2.key2);// abc
JSON在Java中的使用
java中操作json需要导入jar包
javaBean和json的互转
上述jar包中的gson对象实例中的两个方法toJson()
以及fromJson()
可以实现该过程
/**
* 1.2.1、javaBean和json的互转
*/
@Test
public void test1(){
Person person = new Person(1, "tom");
// 创建Gson对象实例
Gson gson = new Gson();
// toJson方法可以把java对象转换成为json字符串
String personJsonString = gson.toJson(person);
System.out.println(personJsonString); //{"id":1,"name":"gjs"}
// fromJson把json字符串转换回Java对象
// 第一个参数是json字符串
// 第二个参数是转换回去的Java对象类型
Person person1 = gson.fromJson(personJsonString, Person.class);
System.out.println(person1); //Person{id=1, name='gjs'}
}
List和json的互换
/**
* 1.2.2、List 和json的互转
*/
@Test
public void test2(){
List<Person> personList = new ArrayList<>();
personList.add(new Person(1, "gjs"));
personList.add(new Person(2, "ylk"));
Gson gson = new Gson();
// 把List转换为json字符串
String personListJsonString = gson.toJson(personList);
System.out.println(personListJsonString);
List<Person> json = gson.fromJson(personListJsonString, new PersonListType().getType());
System.out.println(json);
}
注意,在获取List<Person>
类的时候,不能直接写List(Person).getClass()
,这会出错,需要按照gson规范的方式来写,也就是第16行的代码。该类需要继承gson
提供的规范。
public class PersonListType extends TypeToken<ArrayList<Person>> {}
map和json的互换
/**
* 1.2.3、map 和json的互转
*/
@Test
public void test3(){
Map<Integer, Person> personHashMap = new HashMap<>();
personHashMap.put(1, new Person(1, "gjs"));
personHashMap.put(2, new Person(2, "ylk"));
Gson gson = new Gson();
// 把 map 集合转换成为 json字符串
String personMapJsonString = gson.toJson(personHashMap);
System.out.println(personMapJsonString);
// Map<Integer, Person> personMap2 = gson.fromJson(personMapJsonString, new PersonMapType().getType());
Map<Integer, Person> personMap2 = gson.fromJson(personMapJsonString, new TypeToken<Map<Integer, Person>>(){}.getType());
System.out.println(personMap2);
Person p1 = personMap2.get(1);
System.out.println(p1);
}
-
说明,如果每一个新定义的集合类都定一个类的话就会很冗余,于是这里可以使用匿名内部类的方式,构建
TypeToken
l类的匿名内部类对象,然后获取其类型new TypeToken<Map<Integer, Person>>(){}.getType()