java - 如何使用 Gson 序列化包含 HashMap 作为属性的类?还反序列化?

标签 java json serialization hashmap gson

我想序列化一个包含 HashMap 的类,并且 hHashHap 有一个类键。但出了问题。

    public class Buyer {
        private long wallet;
        private HashMap<Discount, Integer> discountCodes;
    }

当我使用toJson方法时

"discountCodes":{"model.Discount@18769467":1,"model.Discount@1cf4f579":2}

它是这样序列化的,所以在反序列化时会导致错误

Exception in thread "main" com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 34 path $[0].discountCodes.

我的意思是如何将Buyer的对象转换为json而不是转换HashMap

最佳答案

  1. 将包含泛型类型的 HashMap 序列化为 JSON
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);

生成的json:

{
  "1": {
    "id": 1,
    "name": "Alex",
    "dob": {
      "year": 1990,
      "month": 1,
      "day": 1
    }
  },
  "2": {
    "id": 2,
    "name": "Bob",
    "dob": {
      "year": 1990,
      "month": 2,
      "day": 1
    }
  }
}
  • 将 JSON 转换为包含自定义对象的 HashMap
  •         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); 
    

    关于java - 如何使用 Gson 序列化包含 HashMap 作为属性的类?还反序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61836424/

    相关文章:

    java - Jackson 序列化后功能

    windows - Windows 上的检查点(快照/恢复)库?

    java - @FindBy WebElements 未在 PageFactory/页面对象框架中初始化

    java - 是否有 open-jdk-8 版本?如果有,如何获取?

    java - 使用可滑动的选项卡更改单个 fragment 中的数据

    javascript - 在 AJAX JSON 响应中包含 HTML

    java.lang.ClassNotFoundException : org. hibernate.collection.internal.PersistentBag - 找不到我正在寻找的类

    java - 使用 Jackson 读取 yaml 来对象

    php - 从 JSON 反序列化到 PHP,使用强制转换?

    c# - 使用 ReferenceLoopHandling.Ignore 序列化循环依赖的 ISerializable 对象时抛出 StackOverflowException