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

use*_*834 7 java serialization wrapper jackson

有没有一种方法来启用/禁用UNWRAP_ROOT_VALUE,并WRAP_ROOT_VALUE在杰克逊的ObjectMapper动态.我必须根据调用的服务启用/禁用这些属性,有些请求需要a 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));
 }
Run Code Online (Sandbox Code Playgroud)

Ond*_*žka 2

1) 每类根包装

有两个问题jackson-databind

如果没有 Jackson 的支持,我认为除了手动将每个类包装到属性中之外,没有其他方法可以在不编写更多代码的情况下做到这一点。

一种方法是利用 JAXB 的功能根据类似 XPath 的表达式来反/序列化属性(即将foo/bar属性包装在 下foo),但这不受 Jackson 支持。

编辑:

我查看了代码,DefaultSerializerProvider然后四处查看。杰克逊 2.9.9。Jackson目前不区分“无属性名称”和“默认属性名称”。所以,AFAICT,DefaultSerializerProvider不知道是否@JsonRootName存在或为空。

如果这种区别得到传播,这可能会开始发挥作用。我正在等待维护者判断。然而,如果杰克逊本身没有改变,从外部做这件事就有点不切实际。

2) 动态切换根环绕

也许你可以有 2 个ObjectMappers,一个带 ,一个不带WRAP_ROOT_NAME,然后使用正确的一个。

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