8

有没有办法动态启用/禁用杰克逊的UNWRAP_ROOT_VALUEand 。 我必须根据调用的服务启用/禁用这些属性,有些请求需要 a而有些则不需要。WRAP_ROOT_VALUEObjectMapper
JsonRootName

@JsonRootName在确实需要它的类中有注释。
我有一个ObjectMapper扩展杰克逊对象映射器的自定义类。
我正在调用一种方法来启用/禁用属性,具体取决于调用的服务,但它似乎不起作用。

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));
 }
4

1 回答 1

1

1) 每类根包装

有两个问题jackson-databind

如果没有 Jackson 的支持,除了手动将每个类包装到一个属性中之外,我认为如果不编写更多代码就无法做到这一点。

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

编辑:

我看了看代码,转了DefaultSerializerProvider一圈。杰克逊 2.9.9。Jackson 目前不区分“无属性名”和“默认属性名”。所以,AFAICT,DefaultSerializerProvider不知道@JsonRootName是有还是空。

如果传播了这种区别,则可以开始工作。我在等待维护者的判断。然而,如果杰克逊本身没有变化,从外部做这件事有点不切实际。

2)动态切换根包装

也许你可以有 2 个ObjectMapper,一个有,一个没有WRAP_ROOT_NAME,并使用正确的一个。

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

于 2019-06-10T05:16:44.667 回答