目前数据交互中最常用的数据交互格式莫过于json了,那么在java开发中经常会遇到json的序列化与反序列化,常用的json序列化工具有阿里的Fastjson、spring mvc内置的Jackson、还有谷歌的Gson。
GSON是Google提供的用来在Java对象和JSON数据之间进行映射的Java类库。可以将一个Json字符串转成一个Java对象,或者将一个Java对象转化为Json字符串。
Gson特点:1:面向对象;2:简洁高效;3:数据传递和解析方便
下面介绍一下Gson的用法
1.首先引入依赖
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>
2.用来做示例的实体类Student的代码,如下:
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Data
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class Student {
/* 姓名*/
private String name;
/* 性别*/
private String sex;
/* 年龄*/
private Integer age;
}
3.public String toJson(Object src);
方法作用:把实体对象转换为json(序列化)
import com.google.gson.Gson;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Main {
public static void main(String[] args) {
//创建实体类
Student student = new Student("Tom", "男", 25);
Student student1 = new Student("Jerry", "女", 23);
//实例化Gson
Gson gson = new Gson();
//把对象序列化为json
String s = gson.toJson(student);
System.out.println("student对象序列化后的结果为:"+s);
//定义List集合
List<Student> studentList = new ArrayList<>();
studentList.add(student);
studentList.add(student1);
String s1 = gson.toJson(studentList);
System.out.println("List集合序列化后的结果为:"+s1);
Map<String, Student> studentMap = new HashMap<>();
s;tudentMap.put("student",student);
studentMap.put("student1",student);
System.out.println("Map集合序列化后的结果为:"+studentMap);
}
}
输出如下:
student对象序列化后的结果为:{"name":"Tom","sex":"男","age":25}
List集合序列化后的结果为:[{"name":"Tom","sex":"男","age":25},{"name":"Jerry","sex":"女","age":23}]
Map集合序列化后的结果为:{student=Student(name=Tom, sex=男, age=25), student1=Student(name=Tom, sex=男, age=25)}
4.public T fromJson(String json, Type typeOfT)
方法作用:
(1)把json转换为List对象(反序列化)
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.util.List;
public class Main {
public static void main(String[] args) {
// 定义json
String json = "[{\"name\":\"Jerry\",\"sex\":\"女\",\"age\":23}]";
//实例化Gson
Gson gson = new Gson();
//把json序列化为List对象
List<Student> o = gson.fromJson(json, new TypeToken<List<Student>>() {
}.getType());
System.out.println(json);
System.out.println("反序列化成List后的结果为:"+o.toString());
}
}
输出为:
[{"name":"Jerry","sex":"女","age":23}]
反序列化成List后的结果为:[Student(name=Jerry, sex=女, age=23)]
(2)把json转换为Map对象(反序列化)
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.util.HashMap;
public class Main {
public static void main(String[] args) {
//实例化Gson
Gson gson = new Gson();
//定义json
String jsonMap = "{'序列化测试':{name='Tom', sex='男', age=25}}";
//把json序列化为Map对象
HashMap<String,Student> o1 = gson.fromJson(jsonMap, new TypeToken<HashMap<String,Student>>() {
}.getType());
System.out.println("反序列化成Map后的结果为:"+o1);
}
}
输出为:
(3)把json转换为实体对象(反序列化)
import com.google.gson.Gson;
public class Main {
public static void main(String[] args) {
// 定义json
String json = "{\"name\":\"转换对象\",\"sex\":\"女\",\"age\":20}";
//实例化Gson
Gson gson = new Gson();
//把json序列化为实体类(Test)对象
Student student = gson.fromJson(json, Student.class);
//输出---反序列化后的结果为:StudentEntity{name='转换对象', sex='女', age=20}
System.out.println("反序列化成实体类后的结果为:"+student.toString());
}
}
输出为:
注意事项:
一、把实体类序列化为json时,如果实体类某个属性的值为null,gson在序列化该对象是则默认过滤掉该属性,该属性不会参与序列化。
二、反序列化时需注意json串的格式,如果是数组则最外层是用‘[ ]’来包括的,如果是对象或者是Map则是用‘{}’来包括的,根据需要反序列化的json格式来选定需要反序列化用的方法gson.fromJson()应该传递哪种参数,反序列化成对象参数应该是这个对象的反射(entity.Class),如果是List或者是Map,参数则是泛型。