我有一个看起来像这样的课程:
@JsonFormat(shape=JsonFormat.Shape.OBJECT)
public class MyMap implements Map<String, String>
{
protected Map<String, String> myMap = new HashMap<String, String>();
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”没有与地图序列化? 如何序列化内部属性?
答案 0 :(得分:3)
最有可能的是,您最终会实现自己的序列化程序,它将处理您的自定义Map类型。有关更多信息,请参阅this question。
如果您选择使用合成替换继承,那就是让您的类包含一个不扩展地图的地图字段,那么使用the @JsonAnyGetter annotation很容易解决这个问题。
以下是一个例子:
public class JacksonMap {
public static class Bean {
private final String field;
private final Map<String, Object> map;
public Bean(String field, Map<String, Object> map) {
this.field = field;
this.map = map;
}
public String getField() {
return field;
}
@JsonAnyGetter
public Map<String, Object> getMap() {
return map;
}
}
public static void main(String[] args) throws JsonProcessingException {
Bean map = new Bean("value1", Collections.<String, Object>singletonMap("key1", "value2"));
ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.writeValueAsString(map));
}
}
输出:
{"field":"value1","key1":"value2"}