jackson序列化地图与额外的字段
如果一个类扩展了Map并包含一些额外的字段。 EG是最后修改日期,jackson似乎忽略了任何未作为地图属性包含的内容。
我有一个看起来如下的类:
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 { 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"}
其中不包括上次修改日期。
我已经尝试将@JsonInclude
注释添加到属性和getter中,但这并不会导致它包含额外的字段。
让jackson包括这个额外领域的正确方法是什么?
扩展HashMap通常被认为是不好的做法。 相反,您应该创建一个具有 Map和附加字段的类。
这将解决您的问题,但也会有其他优势:
- 您将能够封装规则(例如阻止添加某些键/值等)
- 如果需要,您将能够更改Map实现(LinkedHashMap,synchronized map,concurrent map)
默认情况下,您的地图将落入MapSerializer
。 您可以注册一个序列化修饰符来添加自定义属性,但最好将地图嵌套为Foo
的属性并将其展开:
@JsonUnwrapped private HashMap fooMap;
而不是@JsonUnwrapped
,您可以像这样使用@JsonAnyGetter
和@JsonAnySetter
:
public class Foo { private OffsetDateTime lastModifiedTime; private HashMap additionalProperties = new HashMap(); public Foo() { super(); lastModifiedTime = OffsetDateTime.now(); } public void setLastModifiedTime(OffsetDateTime newTime) { this.lastModifiedTime = newTime; } public OffsetDateTime getLastModifiedTime() { return this.lastModifiedTime; } @JsonAnyGetter public Map any() { return this.additionalProperties; } @JsonAnySetter public void set(String name, String value) { this.additionalProperties.put(name, value); } }
- java.io.IOException:尝试从封闭流中读取
- jackson – @JsonTypeInfo属性被映射为null?
- 泽西/jackson@JsonIgnore在二传手
- 使用Jackson(Joda-Time模块)进行DateTime反序列化的默认时区
- 将JSON反序列化为类
- 序列化已经有了id的POJO(java.lang.String)
- spring:从控制器返回JSON作为ModelAndVIew
- Jackson ObjectMapper DeserializationConfig.Feature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT
- JsonMappingException没有单一的String构造函数/工厂方法Jackson