Java 对Jackson中的单个实体使用两个JSONSerializer

Java 对Jackson中的单个实体使用两个JSONSerializer,java,jackson,resteasy,Java,Jackson,Resteasy,我找到了一种方法来实现我自己的序列化方法,扩展了JsonSerializer,覆盖了serialize()方法,并将SimpleModule注册到所有内容中。以下是我所拥有的: @Provider @Produces(MediaType.APPLICATION_JSON) public class JacksonConfig implements ContextResolver<ObjectMapper> { @Override public ObjectMapp

我找到了一种方法来实现我自己的序列化方法,扩展了
JsonSerializer
,覆盖了
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;
    }
}
@Provider
@产生(MediaType.APPLICATION_JSON)
公共类JacksonConfig实现ContextResolver{
@凌驾
公共对象映射器getContext(类aClass){
ObjectMapper mapper=新的ObjectMapper();
setSerializationInclusion(JsonInclude.Include.NON_NULL);
SimpleModule FoodModule=新的SimpleModule(“FoodModule”,
新版本(0,1,0,null,“org.foo.bar”,“foo”);
relationshipModule.addSerializer(Foo.class,新的FooJacksonSerializer());
relationshipModule.addDeserializer(Foo.class,新的FooJacksonDeserializer());
映射器注册表模块(fooModule);
返回映射器;
}
}

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

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

@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;
    }

}
@Provider
@产生(MediaType.APPLICATION_JSON)
公共类JacksonConfig实现ContextResolver{
私有对象映射器对象映射器;
私有SpecialObjectMapper SpecialObjectMapper;//扩展ObjectMapper的类
公共JacksonConfig(){
objectMapper=新的objectMapper();
//配置。。。
SpecialLobjectMapper=新的SpecialLobjectMapper();
//与模块的配置。。。
}
@凌驾
公共对象映射器getContext(类clazz){
return clazz==SpecialObjectMapper.class?SpecialObjectMapper:objectMapper;
}
}
在资源类中:

@Context 
private Providers providers;

public String get() {
    ContextResolver<ObjectMapper> contextResolver = 
        providers.getContextResolver(ObjectMapper.class, MediaType.APPLICATION_JSON_TYPE);
    ObjectMapper mapper = someCondition 
        ? contextResolver.getContext(SpecialObjectMapper.class) 
        : contextResolver.getContext(ObjectMapper.class);
    return mapper.writeValueAsString(value);
}
@Context
私人供应商;
公共字符串get(){
ContextResolver ContextResolver=
getContextResolver(ObjectMapper.class、MediaType.APPLICATION\u JSON\u类型);
ObjectMapper映射器=someCondition
?contextResolver.getContext(SpecialObjectMapper.class)
:contextResolver.getContext(ObjectMapper.class);
返回mapper.writeValueAsString(值);
}

我不知道您的目标是什么,但也许您也可以使用或定义一个自定义媒体类型,如
application/vnd.com.foo.bar.foo+json
,并仅为该类型注册序列化程序。

谢谢,视图看起来很有希望,因为可以使用它们对JAX-RS方法进行注释。不幸的是,我的用例稍微复杂一点,它不仅涉及在实体中隐藏某些字段,还涉及以不同的方式呈现它们。有没有一种方法可以为某些视图设置自定义序列化程序?以不同的方式呈现它们听起来像是一种不同的表示形式,因此自定义媒体类型应该适合于此?它是json-ld()。mime类型应该是普通的application/json,但它非常冗长,因此我还需要对相同的数据采用某种一致的方式。我最终得到了你最初的建议,非常感谢!不确定我是否正确理解您的意思:您的特殊序列化程序序列化json ld,而普通序列化程序序列化普通json,但您希望对两者使用相同的MimeType?是的,两者的MimeType应该相同。这就是我的结局。再次感谢你