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

时间:2014-07-08 14:01:28

标签: java json serialization jackson

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

@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”没有与地图序列化? 如何序列化内部属性?

1 个答案:

答案 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"}