# Gson – 序列化和反序列化包含自定义对象的`HashMap`

> 原文： [https://howtodoinjava.com/gson/gson-serialize-deserialize-hashmap/](https://howtodoinjava.com/gson/gson-serialize-deserialize-hashmap/)

了解使用 Google [Gson](https://howtodoinjava.com/apache-commons/google-gson-tutorial-convert-java-object-to-from-json/) 库对`HashMap`进行序列化。 另请学习**使用 Gson 将 JSON** 字符串反序列化为包含自定义对象的[`HashMap`](https://howtodoinjava.com/java-hashmap/)，以便将字段值复制到适当的[通用类型](https://howtodoinjava.com/java/generics/complete-java-generics-tutorial/)中。

这些转换可用于创建`HashMap`的[深层克隆。](https://howtodoinjava.com/java/collections/hashmap/shallow-deep-copy-hashmap/)

## 1.将包含通用类型的`HashMap`序列化为 JSON

使用 Gson 将`HashMap`序列化为 JSON 很容易。 转换`HashMap`之后，只需使用`gson.toJson()`方法即可获取 JSON 字符串。

使用 Gson 将`HashMap`转换为 JSON 字符串的 Java 程序。

```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);

```

```java
{
  "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`类为：

```java
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`涉及两个步骤：

1.  创建代表通用类型的[`com.google.gson.reflect.TypeToken`](https://static.javadoc.io/com.google.code.gson/gson/2.6.2/com/google/gson/reflect/TypeToken.html)。 它强制客户端创建此类的子类，即使在运行时也可以检索类型信息。
2.  使用`gson.fromJson()`方法从 JSON 字符串获取`HashMap`。

Java 程序将 JSON 解析为包含通用类型的`HashMap`对象。

```java
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);
    }
}

```

```java
{1=Employee [id=1, name=Alex, dob=1990-01-01], 2=Employee [id=2, name=Bob, dob=1990-02-01]}

```

学习愉快！