JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成,JSON采用完全独立于语言的文本格式,而且很多语言都提供了对json的支持(包括C,C++,C#,Java,JavaScript,Perl,Python等),这样就使得JSON成为理想的数据交换语言。
轻量级指的是根xml做比较。
数据交换指的是客户端和服务器之间业务数据的传输格式。
json的定义:json是有键值对组成,并且由花括号(大括号)包围,每个键由引号引起来,键和值之间使用冒号进行分隔,多组键值对之间使用逗号进行分隔。
我们创建一个json.html,代码如下:
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="pragma" content="no-cache"/>
<meta http-equiv="cache-control" content="no-cache"/>
<meta http-equiv="Expires" content="0" />
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Insert title heretitle>
<script type="text/javascript">
//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_1_2":"key6_1_2_value"
},{
"key6_2_1":6621,
"key6_2_2":"key6_2_2_value"
}]
};
alert(typeof(jsonObj));
script>
head>
<body>
body>
html>
打开这个html,结果如下:
说明json就是一个对象。
json的访问:json本身是一个对象,json中的key我们可以理解为对象中的一个属性,json中的key访问就跟访问对象的属性一样,json对象key
如:
访问key1:
alert(jsonObj.key1);
alert(jsonObj.key4);
alert(jsonObj.key5);
alert(jsonObj.key5.key5_1);
JSON的存在有两种形式:一种是对象的形式存在,我们叫它json对象;一种是,字符串的形式存在,我们叫它json字符串
一般我们要操作json中的数据时,需要json对象的格式,在客户端和服务器之间进行数据交换时,使用json字符串
JSON.stringify() 把json对象转换为json字符串
JSON.parse() 把json字符串转换为json对象
我们修改json.html代码
var jsonObjString=JSON.stringify(jsonObj);//特别像Java中对象的toString
alert(jsonObjString);
//把json字符串转换成为json对象
var jsonObj2=JSON.parse(jsonObjString);
alert(jsonObj2);
alert(jsonObj2.key1);
我们先导包,在pom.xml中添加如下代码,导入gson的jar包
<dependency>
<groupId>com.google.code.gsongroupId>
<artifactId>gsonartifactId>
<version>2.2.4version>
dependency>
创建一个包,用来演示JSON在Java中的使用,我们假设这个包名为:
com.atguigu.pojo
1.JavaBean和json的转换
创建一个包,名为com.atguigu.json,在pojo软件包下创建一个Person.java
package com.atguigu.pojo;
public class Person {
private Integer id;
private String name;
public void setId(Integer id){
this.id=id;
}
public Integer getId(){
return this.id;
}
public void setName(String name){
this.name=name;
}
public String getName(){
return this.name;
}
public Person(){}
public Person(Integer id,String name){
this.id=id;
this.name=name;
}
@Override
public String toString(){
return "Person{"+
"id="+id+
",name='"+name+"\'"+
"}";
}
}
我们在pom.xml下导入Gson、Junit和hamcrest-core依赖
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.12version>
<scope>providedscope>
dependency>
<dependency> <groupId>com.google.code.gsongroupId>
<artifactId>gsonartifactId>
<version>2.2.4version>
dependency>
<dependency>
<groupId>org.hamcrestgroupId>
<artifactId>hamcrest-coreartifactId>
<version>1.3version>
<scope>testscope>
dependency>```
然后在json包下写一个测试的类JsonTest.java
```java
package com.atguigu.json;
import com.atguigu.pojo.Person;
import com.google.gson.Gson;
import org.junit.Test;
public class JsonTest {
//1.javaBean和json的转换
@Test
public void test1(){
Person person=new Person(1,"HelloWorld");
//创建Gson对象实例
Gson gson=new Gson();
//toJson方法可以把java对象转换称为字符串
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);
}
}
测试我们的test1方法,结果如下:
2.List和json的转换
我们在JsonTest.java中添加test2方法,代码如下:
//2.List和json的转换
@Test
public void test2(){
List<Person>personList=new ArrayList<Person>();
personList.add(new Person(1,"国哥"));
personList.add(new Person(2,"康师傅"));
Gson gson=new Gson();
//把List转换成json字符串
String personListJsonString=gson.toJson(personList);
System.out.println(personListJsonString);
List<Person>list=gson.fromJson(personListJsonString,personList.getClass());
System.out.println(list);
Person person=list.get(0);
System.out.println(person);
}
测试test2,结果如下:
错误提示信息称无法将Map类型转换为Person
我们在com.atguigu.json软件包下创建一个PersonListType.java,代码如下:
package com.atguigu.json;
import com.atguigu.pojo.Person;
import com.google.gson.reflect.TypeToken;
import java.util.ArrayList;
public class PersonListType extends TypeToken<ArrayList<Person>>{
}
修改JsonTest.java的test2方法
//2.List和json的转换
@Test
public void test2(){
List<Person>personList=new ArrayList<Person>();
personList.add(new Person(1,"国哥"));
personList.add(new Person(2,"康师傅"));
Gson gson=new Gson();
//把List转换成json字符串
String personListJsonString=gson.toJson(personList);
System.out.println(personListJsonString);
//Listlist=gson.fromJson(personListJsonString,personList.getClass());
List<Person>list=gson.fromJson(personListJsonString,new PersonListType().getType());
System.out.println(list);
Person person=list.get(0);
System.out.println(person);
}
运行test2,结果如下:
3.map和json的转换
我们先在com.atguigu.json软件包下创建一个PersonMapType.java,代码如下:
package com.atguigu.json;
import com.atguigu.pojo.Person;
import com.google.gson.reflect.TypeToken;
import java.util.HashMap;
public class PersonMapType extends TypeToken<HashMap<Integer, Person>> {
}
在JsonTest.java添加test3方法,代码如下:
//3.map和json的转换
@Test
public void test3(){
Map<Integer,Person>personMap=new HashMap<Integer, Person>();
personMap.put(1,new Person(1,"国哥好帅"));
personMap.put(2,new Person(2,"康师傅也好帅"));
Gson gson=new Gson();
//把map集合转换称为json字符串
String personMapJsonString=gson.toJson(personMap);
System.out.println(personMapJsonString);
Map<Integer,Person>personMap1=gson.fromJson(personMapJsonString,new PersonMapType().getType());
System.out.println(personMap1);
Person p=personMap1.get(1);
System.out.println(p);
}
运行test3方法,结果如下:
在上面的实例中,我们每次都要创建一个类来继承TypeToken,这很浪费空间,我们可以使用匿名类的方法。代码如下:
//3.map和json的转换
@Test
public void test3(){
Map<Integer,Person>personMap=new HashMap<Integer, Person>();
personMap.put(1,new Person(1,"国哥好帅"));
personMap.put(2,new Person(2,"康师傅也好帅"));
Gson gson=new Gson();
//把map集合转换称为json字符串
String personMapJsonString=gson.toJson(personMap);
System.out.println(personMapJsonString);
//MappersonMap1=gson.fromJson(personMapJsonString,new PersonMapType().getType());
Map<Integer,Person>personMap1=gson.fromJson(personMapJsonString,new TypeToken<HashMap<Integer,Person>>(){}.getType());
System.out.println(personMap1);
Person p=personMap1.get(1);
System.out.println(p);
}