【发布时间】:2016-04-08 08:27:53
【问题描述】:
有manyquestions 与杰克逊有关从ObjectId 到String 的转换。所有答案都建议创建自己的JsonSerializer<ObjectId> 或使用@JsonSerialize(using = ToStringSerializer.class) 注释ObjectId 字段。
但是,我有一张有时包含ObjectIds的地图,即:
class Whatever {
private Map<String, Object> parameters = new HashMap<>();
Whatever() {
parameters.put("tom", "Cat");
parameters.put("jerry", new ObjectId());
}
}
我想让杰克逊把它转换成:
{
"parameters": {
"tom": "cat",
"jerry": "57076a6ed1c5d61930a238c5"
}
}
但我明白了:
{
"parameters": {
"tom": "cat",
"jerry": {
"date": 1460103790000,
"machineIdentifier": 13747670,
"processIdentifier": 6448,
"counter": 10631365,
"time": 1460103790000,
"timestamp": 1460103790,
"timeSecond": 1460103790
}
}
}
我已经用
注册了转换(在 Spring 中)public class WebappConfig extends WebMvcConfigurerAdapter {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
builder
.serializerByType(ObjectId.class, new ToStringSerializer());
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(builder.build());
converters.add(converter);
}
}
并且第一级ObjectIds转换正确。如何让杰克逊也转换嵌套的?我必须为此地图编写自定义转换器吗?
请记住,这个Map 可以嵌套多次(即包含另一个地图)。每当杰克逊看到它时,我只想将ObjectId 转换为String。
【问题讨论】: