gpt4 book ai didi

java - 使用 Jackson 和 Spring 将 JavaScript 数组反序列化为 Java LinkedHashSet 不会删除重复项

转载 作者:IT老高 更新时间:2023-10-28 13:49:16 28 4
gpt4 key购买 nike

假设我有这个客户端 JSON 输入:

{
id: "5",
types: [
{id: "1", types:[]},
{id: "2", types:[]},
{id: "1", types[]}
]
}

我有这门课:

class Entity {
private String id;
private Set<Entity> types = new LinkedHashSet<>();

public String getId() {
return this.id;
}

public String setId(String id) {
this.id = id;
}

public Set<Entity> getTypes() {
return types;
}

@JsonDeserialize(as=LinkedHashSet.class)
public void setTypes(Set<Entity> types) {
this.types = types;
}

@Override
public boolean equals(Object o){
if (o == null || !(o instanceof Entity)){
return false;
}
return this.getId().equals(((Entity)o).getId());
}
}

我有这个 Java Spring 端点,我在 POST 的正文中传递输入请求:

@RequestMapping(value = "api/entity", method = RequestMethod.POST)
public Entity createEntity(@RequestBody final Entity in) {
Set<Entity> types = in.getTypes();
[...]
}

我想要:

Set<Entity> types = in.getTypes();

只有两个条目的顺序正确...因为其中一个是基于 id 的重复项...相反,我在 LinkedHashSet (!) 中得到了重复项

我从我的代码中认为删除重复项会自动工作,但显然不是。

这个问题的背景比 Why do I need to override the equals and hashCode methods in Java? 更广泛。 因为它通过 Java Spring 使用隐式 Jackson 序列化。

最佳答案

仅覆盖 equals 方法将不起作用,因为基于哈希的集契约(Contract)时使用 equalshashCode 方法来查看两个对象是否是相同的。您需要将 Entity 类中的 hashCode() 方法重写为 hashCode()equals()方法需要正确实现才能与基于哈希的集合一起使用。

如果您的要求是,如果 Entity 类的两个对象的部分或全部字段相同,则认为这两个对象是等效的,在这种情况下,您将必须同时覆盖 equals()hashCode() 方法。

例如- 如果只需要 Entity 类中的 id 字段来确定两个对象是否相等,那么您将覆盖 equals(),如下所示:

@Override
public boolean equals(Object o) {
if (this == o)
return true;
if (o instanceof Entity){
Entity that = (Entity) o;
return this.id == null ? that.id == null : this.id.equals(that.id);
}
return false;

}

但是,如果 id 具有相同的值,hashCode() 方法需要被覆盖以产生相同的哈希码,可能是这样的:

@Override
public int hashCode() {
int h = 17;
h = h * 31 + id == null ? 0 : id.hashCode();
return h;
}

只有现在它才能与基于哈希的集合一起正常工作,因为这两种方法都用于唯一地标识一个对象。


更多信息:

关于java - 使用 Jackson 和 Spring 将 JavaScript 数组反序列化为 Java LinkedHashSet 不会删除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41406663/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com