JSON(JavaScript Object Notation)是一种JavaScript对象标识法,是一种轻量级的文本数据交互格式,独立于语言,具有自我描述性,更容易理解。
语法规则
- 数据由键(key)值(value)描述用逗号分隔
- 大括号表示一个完整的对象,可以拥有多个键值对
- 中括号保存数组,多个对象之间使用逗号分隔
例如:
[
{
"name":"Tom",
"salary":3000,
"department":"研发部",
"direction":[
{"language":"C++"},
{"language":"Java"}
]
}
]
JSON在JS中的应用
初始化
JSON作为JS对象的一种同样可以用var来定义,如下:
var json = [
{
"empId":"S001",
"name":"Jerry",
"department":"研发部"
},
{
"empId":"S002",
"name":"Tom",
"department":"市场部",
"province":[
{"name":"河北"},
{"name":"天津"}
]
}
];
console.log(json);
通过输出在控制台的信息可以看出,JSON的本质就是一个复杂的数组。
同样也可以先定义一个空数组,在通过赋值的方式定义内容。
var employee = {};
employee.empId = "S003";
employee.name = "Jack";
employee.department = "研发部";
console.log(employee);
JSON转字符串
调用JSON.stringify()
方法,可将JSON转换为字符串。
// 使用上节的JSON
var str = JSON.stringify(json);
console.log(str);
字符串转JSON
调用JSON.parse()
方法,可以将JSON格式的字符串转换为JSON对象。
var jsonStr = "{\"empId\":\"S004\",\"name\":\"Mary\",\"department\":\"销售部\"}";
var emp = JSON.parse(jsonStr);
console.log(emp);
JSON与Java的交互
Java的JSON工具包有FastJson、Jackson、Gson、Json-lib等。FastJson是阿里巴巴的JSON序列化和反序列化的工具包,拥有简单的API,效率较高的特点。
将实体类进行序列化与反序列化
JSON.toJSONString(Objec object)
:将实体类转换为JSON,返回结果为JSON格式的String字符串。
package com.json;
import com.alibaba.fastjson.JSON;
import java.util.Date;
public class Example {
public static void main(String[] args) {
Date date = new Date();
Employee employee = new Employee(9001, "Tom", 10000f, date, "B805");
String empStr = JSON.toJSONString(employee);
System.out.println(employee);
}
}
toJSONString()方法的参数为Object类,所以也可以将集合元素直接转换为JSON字符串。
JSON.parseObject(String text, Class<T> clazz)
:将String字符串转换为实体类。
package com.json;
import com.alibaba.fastjson.JSON;
import java.util.Date;
public class Example {
public static void main(String[] args) {
Date date = new Date();
Employee employee = new Employee(9001, "Tom", 10000f, date, "B805");
String empStr = JSON.toJSONString(employee);
Employee emp = JSON.parseObject(empStr, Employee.class);
System.out.println(empStr);
System.out.println(emp);
}
}
JSON.parseArray(String text, Class<T> clazz)
:将多元素JSON字符串转换为数组,返回的结果为List集合。
package com.json;
import com.alibaba.fastjson.JSON;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
public class Example {
public static void main(String[] args) {
List<Employee> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Employee emp = new Employee();
emp.setEmpId(9001 + i);
emp.setName("员工" + i);
list.add(emp);
}
String empsStr = JSON.toJSONString(list);
List<Employee> emps = JSON.parseArray(empsStr, Employee.class);
System.out.println(empsStr);
for (Employee e : emps) {
System.out.println(e);
}
}
}
FastJson注解
在Java应用中,可以通过使用FastJson提供的注解来写在实体类的属性上,对属性进行规范,例如@JSONField(name = "time")
可以修改JSON字符串的键名称,@JSONField(format = "yyyy-MM-dd")
对该属性进行格式化,@JSONField(serialize = false)
可以设置该属性是否展示在JSON字符串中。
示例:
package com.json;
import com.alibaba.fastjson.annotation.JSONField;
import java.util.Date;
public class Employee {
private Integer empId;
private String name;
private Float salary;
@JSONField(name = "time", format = "yyyy-MM-dd")
private Date createTime;
@JSONField(serialize = false)
private String address;
public Employee() {
}
public Employee(Integer empId, String name, Float salary, Date createTime, String address) {
this.empId = empId;
this.name = name;
this.salary = salary;
this.createTime = createTime;
this.address = address;
}
public Integer getEmpId() {
return empId;
}
public void setEmpId(Integer empId) {
this.empId = empId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Float getSalary() {
return salary;
}
public void setSalary(Float salary) {
this.salary = salary;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "Employee{" +
"empId=" + empId +
", name='" + name + '\'' +
", salary=" + salary +
", createTime=" + createTime +
", address='" + address + '\'' +
'}';
}
}