gpt4 book ai didi

java - Jackson @JsonValue 注释有选择地覆盖或禁用

转载 作者:行者123 更新时间:2023-12-05 06:36:36 24 4
gpt4 key购买 nike

我有一个具有以下属性的枚举:

private Integer id;
private String name;
private String description;

这个枚举有一个带有 Jackson 的 @JsonValue 注释的函数:

@JsonValue
public String toValue() {
return Stream.of(values())
.filter(eventType -> eventType == this)
.findAny()
.map(EventType::toString)
.orElseThrow(() -> new IllegalArgumentException("Unable to convert EventType to value:" + this));
}

这会按预期执行,将枚举值序列化为 toString 返回的值,即枚举的名称。

我希望能够禁用@JsonValue 注释并只使用 Jackson 附加到此类的其他默认 JSON 序列化行为:@JsonFormat(shape = JsonFormat.Shape.OBJECT) 在某些情况下必须获取代表整个枚举的对象,而不仅仅是名称。

Jackson 似乎没有这种内在的能力(要么是那样,要么是我不太了解)。我无法创建扩展此类的包装类,因为 Java 不允许使用枚举。

有什么建议吗?

最佳答案

这可以使用 Mixin 来实现。

保持枚举类不变,创建一个混合类:

// MyEnumMixin.java

import com.fasterxml.jackson.annotation.JsonValue;

public abstract class MyEnumMixin {

@JsonValue(false)
public abstract String toValue();
}

然后在创建 Mapper 时添加 mixin

// MyService.java

...
ObjectMapper mapper = new ObjectMapper();
mapper.addMixIn(MyEnum.class, MyEnumMixin.class);
return mapper.writeValueAsString(pojoWithEnum);
...


归功于 https://stackoverflow.com/users/6911095/ldz帮助我解决类似的问题并能够在此处添加答案。 https://stackoverflow.com/a/59459177/7589862

关于java - Jackson @JsonValue 注释有选择地覆盖或禁用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48917595/

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