gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:37:39 24 4
gpt4 key购买 nike

有没有办法动态启用/禁用 Jackson 的 ObjectMapper 中的 UNWRAP_ROOT_VALUEWRAP_ROOT_VALUE
我必须根据调用的服务启用/禁用这些属性,有些请求需要 JsonRootName 而有些则不需要。

我在需要它的类中有 @JsonRootName 注释。
我有一个扩展 Jackson 对象映射器的自定义 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));
}

最佳答案

1) 每类根包装

jackson-databind 有两个问题,

没有 Jackson 的支持,除了手动将每个类包装到属性中之外,我认为除了编写更多代码之外别无他法。

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

编辑:

我查看了代码、DefaultSerializerProvider 和周围。 jackson 2.9.9。Jackson 目前不区分“无属性名”和“默认属性名”。因此,AFAICT,DefaultSerializerProvider 不知道 @JsonRootName 是否存在或为空。

如果传播了这个区别,它就可以开始工作了。我在等待维护者判断。但是,如果 Jackson 本身没有变化,从外部进行此操作就有点不切实际了。

2) 动态切换根包装

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

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

关于java - 在 Jackson 的 ObjectMapper 中动态启用/禁用 UNWRAP_ROOT_VALUE 和 WRAP_ROOT_VALUE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17187627/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com