JSON轻量级数据交换格式
- JSON语法的书写规则
- JSON与JavaScript的交互技巧
- JSON与Java之间的序列化与反序列化
JSON介绍
- JSON(JavaScript Object Notation JavaScript对象表示法)
- JSON是轻量级的文本数据交换格式
- JSON独立于语言,具有自我描述性,更易理解
JSON语法规则
- 数据由键(key)/值(value)描述,由逗号分隔
- 大括号代表一个完整的对象,拥有多个键值对
- 中括号保存数组,多个对象之间使用逗号分隔
- 复合类型的值只能是数组或对象,不能是函数、日期对象、正则表达式等。
- 简单类型的值包括:字符串、数值、布尔值和null(不能使用NaN/undefined)。
- 字符串必须使用双引号表示,不能使用单引号,或者没有双引号。
- 对象的键必须放在双引号里。
- 数组或对象的最后一个成员后面不能加逗号。
JavaScript访问JSON对象
JavaScript中可以直接访问JSON对象
<script>
var emp = [
"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"
}
}
];
console.log(emp);
</scrhtmlipt>
JavaScript中将字符串互相转换为JSON
- JSON.parse()方法将字符串转为JSON对象
- JSON.stringify()方法将JSON对象转换为字符串
注意:JSON对象是浏览器内置对象,但是要版本ie6/7以上才有
字符串转JSON:
<script type="text/javascript">
var str = "{\"class_name\":\"一年级二班\"}"
var json = JSON.parse(str);
console.log(str);
console.log(json);
document.write("班级:"+json.class_name);
</script>
JSON转为字符串:
</script>
Javascript初始化JSON对象
<script type="text/javascript">
var json = {};
json.class_name = "一年级二班";
json.age = 18;
console.log(json);
</script>
JSON与Java交互
- Java的JSON工具包还有FastJson(国内阿里巴巴)、Jackson(国外老牌的工具包)、Gson(Google)、Json-lib(很多开源平台的明星项目)…
- FastJson是阿里巴巴著名的JSON序列号与反序列化工具包
- FastJson国内拥有大量使用者,拥有API简单,效率高等优点
FastJson:
https://github.com/alibaba/fastjson/wiki/Quick-Start-CN
下载jar包导入工程
FastJson对象序列化与反序列化
Employee.java
package json;
import java.util.Date;
import com.alibaba.fastjson.annotation.JSONField;
public class Employee {
private Integer empno;
private String ename;
private String job;
// 使用注解对日期进行格式化说明,否则输出一个1970年到现在的毫秒段
// @JSONField(format="yyyy-MM-dd HH:mm:ss SSS")
//还可以给设置别名name
@JSONField(name="hiredate", format="yyyy-MM-dd")
private Date hdate;
private Float salary;
//说明该属性不进行序列化
@JSONField(serialize=false)
private String dname;
public Employee() {}
public Employee(Integer empno, String ename, String job, Date hdate, Float salary, String dname) {
super();
this.empno = empno;
this.ename = ename;
this.job = job;
this.hdate = hdate;
this.salary = salary;
this.dname = 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;
}
}
FastJsonSample.java
package json;
import java.util.Calendar;
import com.alibaba.fastjson.JSON;
public class FastJsonSample {
public static void main(String[] args) {
Calendar cal = Calendar.getInstance();
cal.set(2021, 0, 30, 0, 0, 0);
Employee employee = new Employee(666, "花木兰", "客户经理", cal.getTime(), 10000f, "市场部");
//FastJSON中提供了JSON对象,完成对象与JSON字符串的互相转换
//对象转JSON
String json = JSON.toJSONString(employee);
System.out.println(json);
//JSON字符串转对象
Employee emp = JSON.parseObject(json, Employee.class);
System.out.println(emp.getDname());
}
}
FastJSON对象数组序列化与反序列化
FastJSONSample2.java
package json;
import java.util.ArrayList;
import java.util.List;
import com.alibaba.fastjson.JSON;
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(i);
employee.setEname("员工"+i);
emplist.add(employee);
}
//依然用JSON.toJSONString对对象列表进行转换;如果属性为null则不转换
String json = JSON.toJSONString(emplist);
System.out.print(json);
// JSON字符串列表转换为list集合
List<Employee> emps = JSON.parseArray(json, Employee.class);
for(Employee e:emps) {
System.out.println(e.getEmpno()+e.getEname());
}
}
}