如何使用map进行多态jackson序列化

时间:2014-04-19 16:45:34

标签: java json jackson

我尝试将Jackson属性类型信息序列化,即使我的类型被地图引用。

使用这个简单的样本:

import java.util.HashMap;

import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonTypeName;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class DemoJackson {
    @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY)
    public static abstract class Animal {}

    @JsonTypeName("cat")
    public static class Cat extends Animal {}

    public static void main(String[] args) throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();

        Cat cat = new Cat();
        System.out.println(objectMapper.writeValueAsString(cat));

        HashMap<String, Object> map = new HashMap<String, Object>();
        map.put("data", cat);

        System.out.println(objectMapper.writeValueAsString(map));
    }
}

我明白了:

{"@type":"cat"}
{"data":{}}

但我想:

{"@type":"cat"}
{"data":{"@type":"cat"}}

有可能吗?怎么做?

我尝试了enableDefaultTyping,但我得到了:

{"@type":"cat"}
{"data":["DemoJackson$Cat",{}]}

1 个答案:

答案 0 :(得分:2)

当您直接序列化地图时,由于通用类型,对象映射器需要有关地图内容的类型信息。请参阅Polymorphic Type Handling wiki page的第5.1章。

序列化动物地图时传递类型参考信息的示例。

objectMapper.writerWithType(new TypeReference<Map<String, Animal>>() {})
    .writeValueAsString(map)

输出:

{"@type":"cat"}
{"data":{"@type":"cat"}}