在Jackson中使用两个JsonSerializer作为单个实体

时间:2015-06-15 11:38:43

标签: java jackson resteasy

我找到了一种方法来实现我自己的序列化方法,扩展JsonSerializer<Foo>,覆盖serialize()方法并注册SimpleModule所有内容。这就是我所拥有的:

@Provider
@Produces(MediaType.APPLICATION_JSON)
public class JacksonConfig implements ContextResolver<ObjectMapper> {


    @Override
    public ObjectMapper getContext(Class<?> aClass) {
        ObjectMapper mapper = new ObjectMapper();
        mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        SimpleModule fooModule = new SimpleModule("FooModule",
                                      new Version(0, 1, 0, null, "org.foo.bar", "foo"));
        relationshipModule.addSerializer(Foo.class, new FooJacksonSerializer());
        relationshipModule.addDeserializer(Foo.class, new FooJacksonDeserializer());
        mapper.registerModule(fooModule);
        return mapper;
    }
}

但是,有没有办法使用两种自定义序列化策略,并根据REST请求(我使用RestEasy)选择正确的一种?即在运行时以程序方式更改它,而不是在设置上下文时。我希望有一个简洁的Foo形式和详细的形式。

1 个答案:

答案 0 :(得分:2)

您可以实现一个特殊的ObjectMapper并手动获取您需要的那个:

RC

在您的资源类中:

unsafe

我不知道你的目标是什么,但也许你也可以使用Jackson's JSON Views来实现它,或者定义像@Provider @Produces(MediaType.APPLICATION_JSON) public class JacksonConfig implements ContextResolver<ObjectMapper> { private ObjectMapper objectMapper; private SpecialObjectMapper specialObjectMapper; // a class extending ObjectMapper public JacksonConfig() { objectMapper = new ObjectMapper(); // configuration ... specialObjectMapper = new SpecialObjectMapper(); // configuration with module ... } @Override public ObjectMapper getContext(Class<?> clazz) { return clazz == SpecialObjectMapper.class ? specialObjectMapper : objectMapper; } } 这样的自定义MediaType,并仅为此类型注册序列化器。