JSON定义:JSON是轻量级的数据交换格式,全称JavaScript 对象表示法(JavaScript Object Notation)
1、JSON语法
JSON语法规则
JSON 数据的书写格式是:名称/值对
"firstName" : "John"
JSON值包含:
- 数字
- 字符串(双引号)
- 逻辑值(true 和 false)
- 数组(方括号)
- 对象(花括号)
- null
JSON对象
"data":[{"id":157,"recordSummaryId":282,"dispatchOrderId":null,"isSummary":1,"flowLineId":134,"userId":"82","userName":"李海天","auditInfo":"kkk","auditDate":"2018-10-09 17:05:09","result":2,"relateResult":1,"isRead":1,"zzId":102,"flowRoleName":"值班室","relateUserId":83,"isFinished":0}]
JSON数组
{
"employees": [
{ "firstName":"John" , "lastName":"Doe" },
{ "firstName":"Anna" , "lastName":"Smith" },
{ "firstName":"Peter" , "lastName":"Jones" }
]
}
2、JSON的由来
2.1序列化
序列化是把JAVA对象变成二进制的字节流,或者反过来成为反序列化,就是把字节流变成JAVA对象。
序列化的作用:
- 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
- 在网络上传送对象的字节序列;
你可能会疑问,JAVA对象存储在硬盘上,不能直接保存吗?我们来看一个例子。
定义一个Person类,实现Serializable接口
import java.io.Serializable;
2
3 /**
4 * <p>ClassName: Person<p>
5 * <p>Description:测试对象序列化和反序列化<p>
9 */
10 public class Person implements Serializable {
11
12 /**
13 * 序列化ID
14 */
15 private static final long serialVersionUID = -5809782578272943999L;
16 private int age;
17 private String name;
18 private String sex;
19
20 public int getAge() {
21 return age;
22 }
23
24 public String getName() {
25 return name;
26 }
27
28 public String getSex() {
29 return sex;
30 }
31
32 public void setAge(int age) {
33 this.age = age;
34 }
35
36 public void setName(String name) {
37 this.name = name;
38 }
39
40 public void setSex(String sex) {
41 this.sex = sex;
42 }
43 }
序列化和反序列化Person类对象
1 import java.io.File;
2 import java.io.FileInputStream;
3 import java.io.FileNotFoundException;
4 import java.io.FileOutputStream;
5 import java.io.IOException;
6 import java.io.ObjectInputStream;
7 import java.io.ObjectOutputStream;
8 import java.text.MessageFormat;
9
10 /**
11 * <p>ClassName: TestObjSerializeAndDeserialize<p>
12 * <p>Description: 测试对象的序列化和反序列<p>
16 */
17 public class TestObjSerializeAndDeserialize {
18
19 public static void main(String[] args) throws Exception {
20 SerializePerson();//序列化Person对象
21 Person p = DeserializePerson();//反序列Perons对象
22 System.out.println(MessageFormat.format("name={0},age={1},sex={2}",
23 p.getName(), p.getAge(), p.getSex()));
24 }
25
26 /**
27 * MethodName: SerializePerson
28 * Description: 序列化Person对象
29 * @author xudp
30 * @throws FileNotFoundException
31 * @throws IOException
32 */
33 private static void SerializePerson() throws FileNotFoundException,
34 IOException {
35 Person person = new Person();
36 person.setName("gacl");
37 person.setAge(25);
38 person.setSex("男");
39 // ObjectOutputStream 对象输出流,将Person对象存储到E盘的Person.txt文件中,完成对Person对象的序列化操作
40 ObjectOutputStream oo = new ObjectOutputStream(new FileOutputStream(
41 new File("E:/Person.txt")));
42 oo.writeObject(person);
43 System.out.println("Person对象序列化成功!");
44 oo.close();
45 }
46
55 private static Person DeserializePerson() throws Exception, IOException {
56 ObjectInputStream ois = new ObjectInputStream(new FileInputStream(
57 new File("E:/Person.txt")));
58 Person person = (Person) ois.readObject();
59 System.out.println("Person对象反序列化成功!");
60 return person;
61 }
62
63 }
可以看到,JAVA对象需要序列化,才可以存储为计算机上的二进制文件。
如果是网络传输呢?同样需要把JAVA对象序列化为二进制字节流,对方计算机接受到后,再反序列化为JAVA对象。
目前个人使用ServiceResult 对象,序列化后,作为服务器返回的数据。
public class ServiceResult implements Serializable {
/**
* 作为服务器端统一返回的JSON格式
*/
private static final long serialVersionUID = 1L;
private int status;// 状态
private String msg;// 消息
private Object data;// 数据
}
但是,通过这种方式传输数据有个代价。首先双方都必须使用JAVA,其次,序列化双方的类必须一致。
2.2 JSON发展
为了解决上述问题,JSON派上用场。JSON语言中立,无论客户端使用什么语言,都支持解析。并且,相比XML数据精简多了,传输效率更高。