在Jackson的ObjectMapper中动态启用/禁用UNWRAP_ROOT_VALUE和WRAP_ROOT_VALUE?

时间:2013-06-19 09:26:10

标签: java serialization jackson

有没有办法动态启用/禁用杰克逊UNWRAP_ROOT_VALUE中的WRAP_ROOT_VALUEObjectMapper。我必须启用/禁用这些属性,具体取决于调用的服务,某些请求需要JsonRootName而有些请求不需要。我在需要它的类中有@JsonRootName注释。我有一个自定义ObjectMapper类,它扩展了Jackson Object映射器。我正在调用一个方法来启用/禁用属性,具体取决于调用的服务,但它似乎没有工作。

public void setWrapValue(boolean wrap) {

    final AnnotationIntrospector introspector = new JacksonAnnotationIntrospector();     

    this.configure(org.codehaus.jackson.map.DeserializationConfig.Feature.UNWRAP_ROOT_VALUE, wrap);

    this.configure(org.codehaus.jackson.map.SerializationConfig.Feature.WRAP_ROOT_VALUE, wrap);
    this.setDeserializationConfig(this.getDeserializationConfig().withAnnotationIntrospector(introspector));

    this.setSerializationConfig(this.getSerializationConfig().withAnnotationIntrospector(introspector));
 }

1 个答案:

答案 0 :(得分:0)

1)每类根包装

jackson-databind上有两个问题,

在没有Jackson的支持的情况下,除了手动将每个类包装到一个属性中之外,我看不出编写更多代码的方法。

一种方法可能是利用JAXB的功能按照类似XPath的表达式对属性进行反序列化(即foo/bar会将属性包装在foo下),但是Jackson不支持。

编辑:

我查看了DefaultSerializerProvider及附近的代码。杰克逊2.9.9。 Jackson目前不区分“无属性名称”和“默认属性名称”。因此,AFAICT DefaultSerializerProvider不知道@JsonRootName是空还是空。

如果传播这种区别,则可以开始工作。我正在等待维护者进行判断。但是,如果不更改Jackson本身,那么从外部进行此操作将是不切实际的。

2)动态切换根换行

也许您可以有2个ObjectMapper,一个有WRAP_ROOT_NAME,一个没有@Document(collection = "${@DatabaseRepositoryCustom.getCollectionName()}") public class A{} ,然后使用正确的一个。

但是,如果“某些请求需要它而有些则不需要”(假设使用相同的端点),那有点奇怪。还是您的意思是对于某些端点,您需要包装其他端点使用as -s的类型?然后,也许可以使用简单的组成。很难说,请添加一些JSON示例和您的模型类。