我尝试将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",{}]}
答案 0 :(得分:2)
当您直接序列化地图时,由于通用类型,对象映射器需要有关地图内容的类型信息。请参阅Polymorphic Type Handling wiki page的第5.1章。
序列化动物地图时传递类型参考信息的示例。
objectMapper.writerWithType(new TypeReference<Map<String, Animal>>() {})
.writeValueAsString(map)
输出:
{"@type":"cat"}
{"data":{"@type":"cat"}}