繁体   English   中英

杰克逊序列化地图到列表

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM