Gson – 序列化和反序列化包含自定义对象的HashMap
原文: https://howtodoinjava.com/gson/gson-serialize-deserialize-hashmap/
了解使用 Google Gson 库对HashMap
进行序列化。 另请学习使用 Gson 将 JSON 字符串反序列化为包含自定义对象的HashMap
,以便将字段值复制到适当的通用类型中。
这些转换可用于创建HashMap
的深层克隆。
1.将包含通用类型的HashMap
序列化为 JSON
使用 Gson 将HashMap
序列化为 JSON 很容易。 转换HashMap
之后,只需使用gson.toJson()
方法即可获取 JSON 字符串。
使用 Gson 将HashMap
转换为 JSON 字符串的 Java 程序。
HashMap<Integer, Employee> employeeMap = new HashMap<>();
employeeMap.put(1, new Employee(1l, "Alex", LocalDate.of(1990, 01, 01)));
employeeMap.put(2, new Employee(2l, "Bob", LocalDate.of(1990, 02, 01)));
//Deep clone
Gson gson = new Gson();
String jsonString = gson.toJson(employeeMap);
{
"1": {
"id": 1,
"name": "Alex",
"dob": {
"year": 1990,
"month": 1,
"day": 1
}
},
"2": {
"id": 2,
"name": "Bob",
"dob": {
"year": 1990,
"month": 2,
"day": 1
}
}
}
此处的Employee
类为:
import java.time.LocalDate;
public class Employee implements Comparable<Employee>{
private Long id;
private String name;
private LocalDate dob;
public Employee(Long id, String name, LocalDate dob) {
super();
this.id = id;
this.name = name;
this.dob = dob;
}
@Override
public int compareTo(Employee o) {
return this.getId().compareTo(o.getId());
}
//Getters and setters
@Override
public String toString() {
return "Employee [id=" + id + ", name=" + name + ", dob=" + dob + "]";
}
}
2.将 JSON 转换为包含自定义对象的HashMap
要将 JSON 字符串反序列化回HashMap
涉及两个步骤:
- 创建代表通用类型的
com.google.gson.reflect.TypeToken
。 它强制客户端创建此类的子类,即使在运行时也可以检索类型信息。 - 使用
gson.fromJson()
方法从 JSON 字符串获取HashMap
。
Java 程序将 JSON 解析为包含通用类型的HashMap
对象。
import java.lang.reflect.Type;
import java.time.LocalDate;
import java.util.HashMap;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
public class GsonExample
{
public static void main(String[] args)
{
HashMap<Integer, Employee> employeeMap = new HashMap<>();
employeeMap.put(1, new Employee(1l, "Alex", LocalDate.of(1990, 01, 01)));
employeeMap.put(2, new Employee(2l, "Bob", LocalDate.of(1990, 02, 01)));
//Deep clone
Gson gson = new Gson();
String jsonString = gson.toJson(employeeMap);
Type type = new TypeToken<HashMap<Integer, Employee>>(){}.getType();
HashMap<Integer, Employee> clonedMap = gson.fromJson(jsonString, type);
System.out.println(clonedMap);
}
}
{1=Employee [id=1, name=Alex, dob=1990-01-01], 2=Employee [id=2, name=Bob, dob=1990-02-01]}
学习愉快!