1、什么是json序列化和反序列化?
json序列化:就是JavaBean对象转化为JSON格式的字符串。
反序列化:就是序列化的反方向,将字符串转化为JavaBean。
2、为什么要序列化和反序列化?
现在比较流行前后端分离的项目,前后端分离就离不开传递数据,一种好的数据表示形式让开发者和网站能轻易识别是很重要的,而这个数据表示形式就是json。这时候问题又来了,前端要json字符串,后端要javaBean对象(假设后端采用java语言)怎么办?此时就需要json的序列化和反序列化了。
3、流行的类库
json处理有三个比较流行的类库,分别是阿里巴巴开发的FastJson,谷歌开发的Gosn,和Spring Boot内置的Jackson。
4、简单的json形式
{
"myAge": 5,
"myBirth": "2021-01-24 14:19:29 025",
"myName": "小狗"
}
JSONField() 注解
@JSONField(ordinal = 1) //指定json序列化的顺序
@JSONField(serialize = false) //json序列化时忽略该字段
@JSONField(deserialize = false) //json反序列化时转成对象将忽略该字段
@JSONField(format = “yyyy-MM-dd HH:mm:ss SSS”) //时间格式转换
常用的方法
JSONObject.toJSONString(value)
将value对象转化成json字符串
JSONObject.parseObject(value,java.class)
将value转化成java对象
JSONObject.parseArray(value,java.class)
将value转化成java对象数组
如果不写java.class,只写value,会转成JSONObject字符串。
创建一个maven项目,导入fastjson和lombok。
lombok中的注解可以让我们不生产get和set方法
<dependency>
<groupId>com.alibabagroupId>
<artifactId>fastjsonartifactId>
<version>1.2.70version>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<version>1.18.8version>
dependency>
1、创建Animal.java类
import com.alibaba.fastjson.annotation.JSONField;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Animal {
@JSONField(name = "myName")
private String myName;
@JSONField(name = "myAge")
private int myAge;
@JSONField(name = "myBirth",format = "yyyy-MM-dd HH:mm:ss SSS")
private Date myBirth;
}
2、创建Persion.java类
import com.alibaba.fastjson.annotation.JSONField;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Persion {
@JSONField(name = "name")
private String name;
@JSONField(name = "age")
private int age;
@JSONField(name = "Birth" ,format = "yyyy-MM-dd HH:mm:ss SSS")
private Date Birth;
}
toJSONString() 的使用
将list集合转化成json
List<Persion> persions = new ArrayList<Persion>();
persions.add(new Persion("张三", 16, new Date()));
persions.add(new Persion("李四", 18, new Date()));
persions.add(new Persion("王五", 20, new Date()));
persions.add(new Persion("麻子", 22, new Date()));
//将list集合转化成json
String jsonPersion= JSON.toJSONString(persions);
System.out.println(jsonPersion);
输出结果如下:
[{
"Birth": "2021-01-24 14:33:43 229",
"age": 16,
"name": "张三"
}, {
"Birth": "2021-01-24 14:33:43 229",
"age": 18,
"name": "李四"
}, {
"Birth": "2021-01-24 14:33:43 229",
"age": 20,
"name": "王五"
}, {
"Birth": "2021-01-24 14:33:43 229",
"age": 22,
"name": "麻子"
}]
将map集合转化成json
Map animal = new HashMap();
animal.put("宠物狗",new Animal("小狗",5, new Date()));
animal.put("波斯猫",new Animal("小猫",6, new Date()));
animal.put("猪",new Animal("小猪",7, new Date()));
//将list集合转化成json
String jsonAnimal = JSON.toJSONString(animal);
System.out.println(jsonAnimal);
输出结果如下:
{
"宠物狗": {
"myAge": 5,
"myBirth": "2021-01-24 14:33:43 370",
"myName": "小狗"
},
"猪": {
"myAge": 7,
"myBirth": "2021-01-24 14:33:43 370",
"myName": "小猪"
},
"波斯猫": {
"myAge": 6,
"myBirth": "2021-01-24 14:33:43 370",
"myName": "小猫"
}
}
一般一个请求,都是有请求头和请求体,它们里面又会有各种参数。
现在假如说有一个world世界类,包含了动物Animal类和Persion类,代码如下。
创建一个world.java
@Data
public class World {
@JSONField(name = "Persion")
private Persion Persion;
@JSONField(name = "Animal")
private Animal Animal;
}
测试
World world = new World();
Persion persion = new Persion("张三",18,new Date());
Animal animal1 = new Animal("小狗",6,new Date());
world.setPersion(persion);
world.setAnimal(animal1);
System.out.println(JSON.toJSONString(world));
输出结果
{
"Animal": {
"myAge": 6,
"myBirth": "2021-01-24 15:32:31 392",
"myName": "小狗"
},
"Persion": {
"Birth": "2021-01-24 15:32:31 392",
"age": 18,
"name": "张三"
}
}
实际封装的json要比和复杂一些。所以路还是很长的。