如何使用基于java.util.Map的类序列化Jackson

我有一个看起来像这样的课:

@JsonFormat(shape=JsonFormat.Shape.OBJECT) public class MyMap implements Map { protected Map myMap = new HashMap(); protected String myProperty = "my property"; public String getMyProperty() { return myProperty; } public void setMyProperty(String myProperty) { this.myProperty = myProperty; } // // java.util.Map mathods implementations // ... } 

以及使用此代码的主要方法:

  MyMap map = new MyMap(); map.put("str1", "str2"); ObjectMapper mapper = new ObjectMapper(); mapper.getDeserializationConfig().withAnnotationIntrospector(new JacksonAnnotationIntrospector()); mapper.getSerializationConfig().withAnnotationIntrospector(new JacksonAnnotationIntrospector()); System.out.println(mapper.writeValueAsString(map)); 

执行此代码时,我得到以下输出:{“str1”:“str2”}

我的问题是为什么内部属性“myProperty”没有与地图序列化? 如何序列化内部属性?

最有可能的是,您最终会实现自己的序列化程序,它将处理您的自定义Map类型。 有关更多信息,请参阅此问题 。

如果您选择使用合成替换inheritance,即使您的类包含不扩展地图的地图字段,那么使用@JsonAnyGetter注释很容易解决这个问题。

这是一个例子:

 public class JacksonMap { public static class Bean { private final String field; private final Map map; public Bean(String field, Map map) { this.field = field; this.map = map; } public String getField() { return field; } @JsonAnyGetter public Map getMap() { return map; } } public static void main(String[] args) throws JsonProcessingException { Bean map = new Bean("value1", Collections.singletonMap("key1", "value2")); ObjectMapper mapper = new ObjectMapper(); System.out.println(mapper.writeValueAsString(map)); } } 

输出:

 {"field":"value1","key1":"value2"}