使用Gson序列化具有对象键的HashMap



我正在编写一些代码来序列化我开发的神经网络系统。这个系统有一个";数据库";它通过将每个基因的ID存储在带有GeneKey的HashMap中来跟踪神经网络的进化,GeneKey是一个记录,包含我们存储的基因之前的基因ID和之后的基因ID。

带有一些数据的HashMap如下所示:

existingNodes = {
GeneKey[a=0, b=3] = 4,
GeneKey[a=1, b=4] = 5
}

除了这个HashMap之外,系统中的所有东西都可以串行化,因为Json只能用数字和字符串作为键,而在我的HashMap中,我使用对象作为键。有没有一种简单的方法可以使用Gson将其序列化为json?

编辑:这就是HashMap的构造方式:

HashMap<GeneKey, Integer> existingNodes = new HashMap<>();
existingNodes.put(new GeneKey(0, 3), 4);
existingNodes.put(new GeneKey(1, 4), 5);
System.out.println("existingNodes = "+registry); 
//existingNodes = {
//    GeneKey[a=0, b=3] = 4,
//    GeneKey[a=1, b=4] = 5
//}

这是GeneKey类:

public record GeneKey(int a, int b) {}

如果您能给出使用Gson序列化后得到的JSON字符串,那将非常有用。

但是,如果这解决了您的问题,请检查以下代码。

使用overriden hashCode和equals方法定义GenKey类为:

public class GeneKey {
private int a;
private int b;

public GeneKey(int a, int b) {
this.a = a;
this.b = b;
}

public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
public int getB() {
return b;
}
public void setB(int b) {
this.b = b;
}

@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + a;
result = prime * result + b;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
GeneKey other = (GeneKey) obj;
if (a != other.a)
return false;
if (b != other.b)
return false;
return true;
}
@Override
public String toString() {
//return "GeneKey [a=" + a + ", b=" + b + "]";
// Updated for deserialization using Gson
Gson gson = new 
GsonBuilder().serializeNulls().disableHtmlEscaping().create();
return gson.toJson(this);
}
}

现在尝试使用Gson:将GenKey作为密钥的HashMap转换为JSON字符串

HashMap<GeneKey, Integer> existingNodes = new HashMap<>();
existingNodes.put(new GeneKey(0, 3), 4);
existingNodes.put(new GeneKey(1, 4), 5);

Gson gson = new 
GsonBuilder().serializeNulls().disableHtmlEscaping().create();

System.out.println(gson.toJson(existingNodes));

这是我在控制台中收到的输出:

{"{"a":0,"b":3}":4,"{"a":1,"b":4}":5}

如果需要,更新答案以添加反序列化逻辑:

//Say, we pass the serialized JSON as a payload to some REST API. We can deserialize the Key of the response as follows - 
@PostMapping("/getJson")
public Map<GeneKey, Integer> getJson(@RequestBody Map<String, Integer> response) {

final Gson gson = new Gson();
Map<GeneKey, Integer> deserializedMap = new HashMap<GeneKey, 
Integer>();

response.keySet().forEach( k -> {
GeneKey key = gson.fromJson(k, GeneKey.class);
deserializedMap.put(key, response.get(k));
});
System.out.println(deserializedMap);
return deserializedMap;
}
GsonBuilder#enableComplexMapKeySerialization

但是,现在映射由条目数组表示。

参见Gson序列化HashMap<教师,列表<学生>gt;

最新更新