gpt4 book ai didi

java - jackson 反序列化带有额外字段的 map

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:08:25 25 4
gpt4 key购买 nike

如果一个类扩展了一个 Map 并包含一些额外的字段。例如上次修改日期,Jackson 似乎忽略了任何未作为 map 属性包含的内容。

我有一个看起来像下面这样的类:

import java.io.IOException;
import java.time.OffsetDateTime;
import java.util.HashMap;
import java.util.Objects;

import com.fasterxml.jackson.databind.ObjectMapper;

public class Foo extends HashMap<String, String> {

private OffsetDateTime lastModifiedTime;

public Foo() {
super();
lastModifiedTime = OffsetDateTime.now();
}

public void setLastModifiedTime(OffsetDateTime newTime) {
this.lastModifiedTime = newTime;
}

public OffsetDateTime getLastModifiedTime() {
return this.lastModifiedTime;
}

public static void main(String[] args) throws IOException {
Foo f = new Foo();
f.put("hello", "world");

ObjectMapper om = new ObjectMapper();
om.findAndRegisterModules();

String result = om.writeValueAsString(f);
if(f.equals(om.readValue(result, Foo.class))) {
System.out.println("Wooo");
} else {
System.out.println("Booo: " + result);
}

}

@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!(obj instanceof Foo)) {
return false;
}
if (!super.equals(obj)) {
return false;
}
Foo foo = (Foo) obj;
return Objects.equals(getLastModifiedTime(), foo.getLastModifiedTime());
}

@Override
public int hashCode() {
return Objects.hash(super.hashCode(), getLastModifiedTime());
}

}

运行时输出 booo: {"hello":"world"} 其中不包括最后修改日期。

我已经尝试向属性和 getter 添加 @JsonInclude 注释,但这不会导致它包含额外的字段。

让 Jackson 包含这个额外字段的正确方法是什么?

最佳答案

扩展 HashMap 通常被认为是不好的做法。相反,您应该创建一个具有 Map 和附加字段的类。

这将解决您的问题,但还有其他优势:

  • 您将能够封装规则(例如防止添加某些键/值等)
  • 如果需要,您将能够更改 Map 实现(LinkedHashMap、同步映射、并发映射)

关于java - jackson 反序列化带有额外字段的 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31320983/

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