JSON
- JavaScript Object Notation(JavaScript对象表示法)
- JSON是轻量级的文本数据交换格式
- JSON独立于语言,具有自我描述性,更易理解
- JSON用于数据的保存和传输
语法
-
数据由键(key)/值(value)描述,由逗号分隔
-
大括号代表一个完整的对象,其中可以拥有多个键/值对
-
中括号保存数组,多个对象之间使用逗号分隔
-
键值除了数字都要用双引号括起来
//数组
[
{
"empno": 7891,
"ename": "王五",
"department": "研发部",
"job": "java工程师",
"salary": 15000
},
{
"empno": 7892,
"ename": "李乐",
"department": "市场部",
"job": "销售经理",
"salary": 18000,
"customers": [
{
"cname": "李晓"
},
{
"cname": "刘通"
}
]
}
]
JavaScript访问JSON对象
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script>
/* 定义一个数组(JSON对象),采用JSON的格式 */
/* 数组中保存的是一个个员工对象 */
var json=[
{
"empno": 7891,
"ename": "王五",
"department": "研发部",
"job": "java工程师",
"salary": 15000
},
{
"empno": 7892,
"ename": "李乐",
"department": "市场部",
"job": "销售经理",
"salary": 18000,
"customers": [
{
"cname": "李晓"
},
{
"cname": "刘通"
}
]
}
];
for(var i=0;i<json.length;i++){
var emp=json[i];
document.write("<h1>");
document.write(emp.empno);
document.write(","+emp.ename);
document.write(","+emp.department);
document.write(","+emp.job);
document.write(","+emp.salary);
document.write("</h1>");
/* emp.customers也是数组(里面保存着对象),在js中数组就是一个对象 ,判断这个对象是否存在*/
if(emp.customers!=null){
document.write("<h2>-----");
for(var j=0;j<emp.customers.length;j++){
var customer=emp.customers[j];
document.write(customer.cname+" ");
}
document.write("</h2>");
}
}
</script>
</head>
<body>
</body>
</html>
JS中字符串和JSON互转
将JSON格式的字符串转换成JSON对象
用JSON.parse()
,JSON是浏览器的内置对象
<script>
/* 长得像JSON的字符串 引号要用转义符*/
var str="{\"name\":\"王勒\"}";
/* 将字符串转换成JSON对象 */
var json=JSON.parse(str);
console.log(json);
</script>
Ajax,是让JS和java后台进行通信的方式,java后台服务器会返回长得像JSON的字符串,通过JSON.parse()
获得JSON对象后,在JS中才能提取其中的属性值。
将JSON对象转换成字符串
用JSON.stringify() 转换成JSON格式的字符串
<script>
/* JSON对象可以是数组对象,也可以是普通对象*/
var json={"name":"张三"};
var str=JSON.stringify(json);
console.log(str);
</script>
初始化JSON对象
var json1={};
json1.name="张丹";
json1.age=18;
json1.sex="女";
console.info(json1);
FastJSON对象的序列化和反序列化
序列化
javaBean
public class Employee {
private int empno;
private String ename;
private String department;
//fastJSON注解,因为日期序列化后是以时间戳的形式呈现,需要用注解指定格式
//name是定义序列化后字符串中的key值
@JSONField(name="firedate",format="yyyy-MM-dd")
private Date hdate;
//让这个属性不被序列化
@JSONField(serialize=false)
private float salary;
public int getEmpno() {
return empno;
}
public void setEmpno(int empno) {
this.empno = empno;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
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;
}
}
对象的序列化
JSON.toJSONString()
public class FastJson {
public static void main(String[] args) {
Employee employee=new Employee();
employee.setEmpno(7895);
employee.setEname("吴磊");
employee.setDepartment("研发部");
Calendar c=Calendar.getInstance();
c.set(2015, 7, 21);
employee.setHdate(c.getTime());
employee.setSalary(15000f);
String json=JSON.toJSONString(employee);
System.out.println(json);
}
}
对象的反序列化
JSON.parseObject(args1,args2)
第一个参数是json格式的字符串,第二个参数是反序列化javaBean的类
- 如果序列化的时候某个属性没有被序列化,那么反序列化的时候就为null或者0
Employee emp=JSON.parseObject(json,Employee.class);
System.out.println(emp.getEname()+emp.getSalary());
对象数组序列化
- 如果对象中的属性为空,那么序列化的时候将自动忽略这个属性,不体现在JSON格式的字符串中
List<Employee> empList=new ArrayList<>();
for(int i=0;i<3;i++) {
Employee emp=new Employee();
emp.setEmpno(4488+i);
emp.setEname("员工"+i);
empList.add(emp);
}
String json=JSON.toJSONString(empList);
System.out.println(json);
对象数组的反序列化
JSON.parseArray()
第一个参数是json格式的字符串,第二个参数是反序列化数组中对象的javaBean的类,返回List<T>
List<Employee> emps=JSON.parseArray(json,Employee.class);
for(Employee e:emps) {
System.out.println(e.getEmpno()+":"+e.getEname());
}
序列化的作用
JSON.parseArray()
第一个参数是json格式的字符串,第二个参数是反序列化数组中对象的javaBean的类,返回List<T>
List<Employee> emps=JSON.parseArray(json,Employee.class);
for(Employee e:emps) {
System.out.println(e.getEmpno()+":"+e.getEname());
}