2014-09-06 67 views
0

我在Spring MVC项目中使用Jackson 2.3.2库,并试图通过实现JSONSerializableWithType接口指定自定义包装对象上的自定义JSON序列化其中包括在尝试将对象实例序列化为JSON时被Jackson调用的名为serialize()的方法。为什么不使用serialize()自定义包装类的方法扩展LinkedHashMap

奇怪的是,只要我的对象包装不扩展LinkedHashMap < ...>,就可以正确调用这个序列化方法。 如果我的对象包装扩展了一个杰克逊“知道”如何以默认方式序列化的类,则不再调用serialize()方法。

我的包装类看起来是这样的:

public class ResponseRoomOccupancy 
    extends LinkedHashMap<...> 
    implements org.codehaus.jackson.map.JsonSerializableWithType { 

    @Override 
    public void serialize(JsonGenerator jgen, SerializerProvider provider) 
      throws IOException, JsonProcessingException { 

     jgen.writeStartObject(); 
     // actual serialization of the object 
     jgen.writeEndObject(); 
    } 

    @Override 
    public void serializeWithType(JsonGenerator jgen, 
      SerializerProvider provider, TypeSerializer typeSer) 
      throws IOException, JsonProcessingException { 
     serialize(jgen, provider); 
    } 
} 

控制器:

@RequestMapping(value = "/occupancy") 
public @ResponseBody ResponseRoomOccupancy 
getRoomOccupancy(RequestRoomOccupancy request) { 

    return appointmentService.getEnrichedRoomOccupancy(request); 
} 

任何人都可以向我解释为什么杰克逊不使用自定义的序列化方法在延伸的LinkedHashMap类?

UPDATE

作为索蒂里奥斯扎Delimanolis正确地指出的那样,JSONSerializableWithType接口是较旧版本的杰克逊(< 1.9)的一部分。 但我不知道为什么这种自定义序列化与自定义类的工作(例如,如果LinkedHashMap与某些类Foo < ...>交换)。

回答

0

您正在使用Jackson 2,其中is completely incompatible with Jackson 1.JsonSerializableWithType是来自Jackson 1的界面。您不能让它们一起使用。杰克逊2根本不寻找JsonSerializableWithType

相反,与

@JsonSerialize(using = YourSerializer.class) 

注解你LinkedHashMap类型,并有YourSerializer做的工作。

关于你的评论和编辑,杰克逊有已知类型,像ListSetStringNumberMap一些默认的串行器/解串器。但是,它不知道您的自定义类型。它必须基于从分析类型中找到的内容来构建新的序列化程序。

+0

好的,这是正确的。但我无法弄清楚,为什么它可以与自定义类一起工作。我更新了这个问题。 – juffel 2014-09-11 09:59:41

+0

@juffel看我的编辑。 – 2014-09-11 14:27:06

+0

我认为杰克逊的这种行为并不是非常一致。 – juffel 2014-09-12 15:01:50

相关问题