# Json入門
[TOC]
## 導學
針對于各位同學,在前端課程中已經學習過Json,所以本章主要講解Json與Java的交互。
## Json語法
JavaScript Object Notation(JavaScript對象表示法),JSON是輕量級的文本數據交互格式,JSON獨立于語言,具有自我描述性,更易于理解逐漸替代了xml。
JSON語法規則:
1. 數據由鍵(key)/值(value)描述,由逗號分隔。
2. 大括號代表一個完整的對象,擁有多個鍵/值對。
3. 中括號保存數組,多個對象之間使用逗號分隔。
4. 復合類型的值只能是數組或對象,不能是函數、日期對象、正則表達式等。
5. 簡單類型的值包括:字符串、數值、布爾值和null(不能使用NaN/undefined)。
6. 字符串必須使用雙引號表示,不能使用單引號,或者沒有雙引號。
7. 對象的鍵必須放在雙引號里。
8. 數組或對象的最后一個成員后面不能加逗號。
~~~json
{
"employee": {
"市場部": [{
"name": "張三",
"salary": 7000,
"time": "1999-02-09",
"job": "市場營銷專員"
}, {
"name": "李四",
"salary": 9000,
"time": "1997-02-09",
"job": "市場經理"
}],
"開發部": [{
"name": "王五",
"salary": 9000,
"time": "2006-02-09",
"job": "Java開發工程師"
}, {
"name": "孫六",
"salary": 12000,
"time": "2003-02-09",
"job": "項目總監"
}],
"總經理": {
"name": "趙一",
"salary": 26000,
"time": "199-02-09"
}
}
}
~~~
## JS中JSON對象和JSON字符串的轉換
>[success] 在數據傳輸中,JSON是以字符串形式傳遞的,而JS操作的是JSON對象
* `JSON.stringify`方法是用于將一個值轉為字符串。該字符串符合 JSON 格式要求,并且可以通過`JSON.parse`方法還原。
* `JSON.parse`方法將 JSON 字符串轉化為對象。
~~~
var jsonStr = '{"name":"Lisa","password":"123"}';
var jsonObj = {"name":"Lisa","password":"123"};
//String轉化為JSON對象
var jsonObject = JSON.parse(jsonStr);
//將對象轉回字符串
var jsonstr = JSON.stringify(jsonObject);
~~~
## JSON與Java進行交互
我們可以借助工具包,使Json和Java對象之間實現相互的轉換,常用Java的JSON工具包有FastJson(阿里巴巴開發),Jackson ,Gson, Json-lib等。
FastJson是阿里巴巴著名的JSON序列化與反序列工具包,FastJson國內擁有大量的使用者,擁有API簡單 效率高等優點。
Fastjson是阿里巴巴的開源JSON解析庫,它可以解析JSON格式的字符串,支持將Java Bean序列化為JSON字符串,也可以從JSON字符串反序列化到JavaBean。 總之就是提供了對象與JSON 之間的轉換。
該工具包可以通過著名的開源平臺[https://github.com](https://github.com/)找到。




### FastJSON對象序列化與反序列化
~~~
import java.util.Date;
import com.alibaba.fastjson.annotation.JSONField;
public class Employee {
private Integer empno;
private String ename;
private String job;
//@JSONField(format="yyyy-MM-dd HH:mm:ss SSS")
//通過FastJson包中設置的注解,設置輸出內容的名稱和格式
@JSONField(name = "hiredate" , format="yyyy-MM-dd")
private Date hdate;
private Float salary;
@JSONField(serialize = false)//設置是否轉換該字段
private String dname;
public Integer getEmpno() {
return empno;
}
public void setEmpno(Integer empno) {
this.empno = empno;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public Date getHdate() {
return hdate;
}
public void setHdate(Date hdate) {
this.hdate = hdate;
}
public Float getSalary() {
return salary;
}
public void setSalary(Float salary) {
this.salary = salary;
}
public String getDname() {
return dname;
}
public void setDname(String dname) {
this.dname = dname;
}
}
~~~
~~~
import java.util.Calendar;
import com.alibaba.fastjson.JSON;
public class FastJsonSample1 {
public static void main(String[] args) {
Employee employee = new Employee();
employee.setEmpno(4488);
employee.setEname("王曉東");
employee.setJob("客戶經理");
employee.setSalary(10000f);
employee.setDname("市場部");
Calendar c = Calendar.getInstance();
c.set(2019, 0, 30, 0, 0, 0);
employee.setHdate(c.getTime());
//FastJSON中提供了JSON對象,完成對象與JSON字符串的互相轉換
String json = JSON.toJSONString(employee);
System.out.println(json);
Employee emp = JSON.parseObject(json, Employee.class);
System.out.println(emp.getEname());
}
}
~~~
### FastJSON對象數組序列化與反序列化
~~~
public class FastJsonSample2 {
public static void main(String[] args) {
List emplist = new ArrayList();
for (int i = 1 ; i <= 100 ; i++) {
Employee employee = new Employee();
employee.setEmpno(4488 + i);
employee.setEname("員工" + i);
emplist.add(employee);
}
String json = JSON.toJSONString(emplist);
System.out.println(json);
List<Employee> emps = JSON.parseArray(json , Employee.class);
for(Employee e : emps) {
System.out.println(e.getEmpno() + ":" + e.getEname());
}
}
}
~~~