Java对象转换为JSON字符串案例

主要内容是Java中利用FastJson对JSON工具的序列化

序列化:简单来说序列化就是用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化,流的概念这里不用多说(就是I/O),我们可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间(注:想要将对象传输于网络必须进行流化)在对对象流进行读写操作时会引发一些问题,而序列化机制也正是用来解决这些问题

示例:利用FastJson将java对象转变为JSON字符串

创建一个Java类程序,使其后面的赋值更加方便

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package com.java.json;

import java.util.Date;

public class Employee {
private Integer empno;
private String ename;
private String job;
private Date hdarw;
private Float salary;
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 getHdarw() {
return hdarw;
}

public void setHdarw(Date hdarw) {
this.hdarw = hdarw;
}

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;
}
}

再创建一个Java类,将刚刚的java类实例化,并进行赋值然后利用FastJson工具将对象转变为字符串(序列化)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package com.java.json;

import com.alibaba.fastjson.JSON;

import java.util.Calendar;

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("工程师");
//月份是从0开始的,所以5代表的是六月,Calendar日历函数,通过set放置开始时间,getTime得到刚刚设置好的时间
Calendar c = Calendar.getInstance();
c.set(2020,5,16,10,38,10);
employee.setHdarw(c.getTime());

//FastJson中提供了Json对象,完成对象与JSON字符串的互相转换
//这里我们将对象序列化变为字符串
String jsonString = JSON.toJSONString(employee);
System.out.println(jsonString);
}
}

结果:输出了刚刚在实例化对象中定义好的属性,并以JSON对象的形式输出出来

fastjson3

JSONField注解

这里发现,上面的hdarw的值是:设置时间的毫秒数,很难看懂;为了解决这个问题,需要用到JSON注释来对日期格式进行格式化输出:@JSONField注释

我们在定义属性的java类中编写JSONField注解

fastjson4

这时候我们在运行的效果:

fastjson5

JSONField注解还可以对输出的key进行描述

fastjson6

此时的效果:

fastjson7

JSONFile注解还可以取消个别属性的JSON序列化

fastjson8

效果:可以看到说已经没有dname这个属性

fastjson9

JSON字符串转换为Java对象

主要内容是Java中利用FastJson对java对象的反序列化

反序列化:Java反序列化就是指把字节序列恢复为Java对象的过程,反序列化最重要的作用是根据字节流中保存的对象状态及描述信息,通过反序列化重建对象

示例:利用FastJson将JSON字符串转变为java对象

Employee emp = JSON.parseObject(jsonString,Employee.class):第一个参数为待转换的JSON字符串,第二个参数为想要转换的已存在类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package com.java.json;

import com.alibaba.fastjson.JSON;

import java.util.Calendar;

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("工程师");
//月份是从0开始的,所以5代表的是六月,Calendar日历函数,通过set放置开始时间,getTime得到刚刚设置的时间
Calendar c = Calendar.getInstance();
c.set(2020,5,16,10,38,10);
employee.setHdarw(c.getTime());

//FastJson中提供了Json对象,完成对象与JSON字符串的互相转换
//这里我们将对象序列化变为字符串
String jsonString = JSON.toJSONString(employee);
System.out.println(jsonString);

//将字符串反序列化为对象
Employee emp =JSON.parseObject(jsonString,Employee.class);
System.out.println(emp.getEname());//输出emp这个JSON对象中的Ename属性
}
}

效果:

fastjson10

Java对象集合与JSON(数组)的转换

在实际业务中,往往会是对多个对象批量出来:这个用处会非常广泛

JSON序列化与反序列化用途,比如:

(1)要求:本地有100个员工对象信息,如何把这100个员工的的信息传递给另外一个系统呢

方法:可以将100个员工的信息JSON序列化,然后传递给另外一个系统;另外一个系统接受后,JSON反序列化成员工对象即可

(2)后面的Ajax中也会用到JSON序列化

多个对象的集合,转成JSON(数组)

String jsonString = JSON.toJSONString(empList):还是这个方法,将对象集合作为参数传入即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.java.json;

import com.alibaba.fastjson.JSON;

import java.util.ArrayList;
import java.util.List;

public class FastJsonSample2 {
public static void main(String[] args) {
List<Employee> emplist = new ArrayList<Employee>();//创建一个集合

for (int i = 1; i <= 10; i++) {//简单模拟一下10个员工;设置了两个属性;
Employee employee = new Employee();//实例化对象
employee.setEmpno(4488+i);
employee.setEname("员工"+i);
emplist.add(employee);//增加到集合中
}
String jsonString=JSON.toJSONString(emplist);//java集合对象序列化为字符串
System.out.println(jsonString);
}
}

输出:发现(1)[]说明这是一个集合;(2)只有empno和ename,说明当某个属性的属性值为null的时候,则FastJson会将其忽略

fastjson11

将JSON数组转成对象的集合

List listEmployee = JSON.pareArray(jsonString,Employee.class);将JSON数组,转变为对象集合

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package com.java.json;

import com.alibaba.fastjson.JSON;

import java.util.ArrayList;
import java.util.List;

public class FastJsonSample2 {
public static void main(String[] args) {
List<Employee> emplist = new ArrayList<Employee>();

for (int i = 1; i <= 10; i++) {//简单模拟一下10个员工;设置了两个属性;
Employee employee = new Employee();
employee.setEmpno(4488+i);
employee.setEname("员工"+i);
emplist.add(employee);
}
String jsonString=JSON.toJSONString(emplist);//序列化,将集合元素变为JOSN(数组)字符串
System.out.println(jsonString);

List<Employee> listEmployee = JSON.parseArray(jsonString,Employee.class);//反序列化,将JSON(数组)字符串变为JSON集合对象
for (Employee e:listEmployee){//增强型for循环,循环遍历JSON集合对象
System.out.println(e.getEmpno()+":"+e.getEname());
}
}
}

效果:

fastjson13