[英]Jackson Serialize Map to List
在内部,我使用映射来快速查找值,例如, private Map<String, CustomObject> lookupTable
,其中CustomObject
具有一些id
字段,该字段被用作lookupTable
的键。 序列化映射的键很愚蠢,因此我想注释内部变量以仅序列化值。 显然,这不起作用:
@JsonSerialize(as = List.class)
private final Map<String, CustomObject> lookupTable;
为什么自定义序列化器不起作用
我创建了一个自定义序列化器,如下所示:
public static class MapValuesJsonSerializer extends JsonSerializer<Map<?, ?>> {
@Override
public void serialize(
Map<?, ?> value,
JsonGenerator generator,
SerializerProvider provider)
throws IOException, JsonProcessingException {
generator.writeObject(value.values());
}
}
然后,我相应地注释了该字段:
@JsonSerialize(using = MapValuesJsonSerializer.class)
public Map<String, CustomObject> lookupTable;
这适用于某些Java测试代码,但是在使用MongoDB的驱动程序和MongoJack时会中断。 我得到了一些无用的异常,我认为这是因为它实际上并未序列化返回的对象,而只是试图将该原始对象传递给BSON序列化器:
Caused by: java.lang.IllegalArgumentException: can't serialize class CustomObject
at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:270)
at org.bson.BasicBSONEncoder.putIterable(BasicBSONEncoder.java:295)
at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:234)
at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:174)
at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:120)
at com.mongodb.DefaultDBEncoder.writeObject(DefaultDBEncoder.java:27)
at com.mongodb.OutMessage.putObject(OutMessage.java:289)
at com.mongodb.DBApiLayer$MyCollection.insert(DBApiLayer.java:239)
at com.mongodb.DBApiLayer$MyCollection.insert(DBApiLayer.java:204)
at com.mongodb.DBCollection.insert(DBCollection.java:148)
at com.mongodb.DBCollection.insert(DBCollection.java:91)
at org.mongojack.JacksonDBCollection.insert(JacksonDBCollection.java:255)
// My code (not the serializer)...
当然,我一问,便找到了解决方案。
使用上面的序列化器,使用provider
而不是直接使用generator
来序列化值。 这是代码:
/**
* <p>
* Serializes the values of some map into a list.
* <p>
*
* @author John Jenkins
*/
public class MapValuesJsonSerializer extends JsonSerializer<Map<?, ?>> {
/*
* (non-Javadoc)
* @see com.fasterxml.jackson.databind.JsonSerializer#serialize(java.lang.Object, com.fasterxml.jackson.core.JsonGenerator, com.fasterxml.jackson.databind.SerializerProvider)
*/
@Override
public void serialize(
final Map<?, ?> value,
final JsonGenerator generator,
final SerializerProvider provider)
throws IOException, JsonProcessingException {
provider.defaultSerializeValue(value.values(), generator);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.