【问题标题】:Jackson annotation "JsonValue" doesn't work杰克逊注释“JsonValue”不起作用
【发布时间】:2016-09-25 06:32:59
【问题描述】:

我希望使用 apiValue (SUN, MON, ...) 而不是枚举值 (SUNDAY, MONDAY, ....) 对以下枚举进行序列化/反序列化。我使用 @JsonValue 注释,但它不起作用(即它使用枚举值)。知道如何解决这个问题吗?

import java.util.*;

import com.fasterxml.jackson.annotation.JsonValue;

public enum ApiNotificationScheduleDayInWeek {
        SUNDAY("SUN", 1), 
        MONDAY("MON", 2), 
        TUESDAY("TUE", 3), 
        WEDNESDAY("WED", 4), 
        THURSDAY("THU", 5), 
        FRIDAY("FRI", 6), 
        SATURDAY("SAT", 7), 
        WEEKDAY("WEEKDAY", 8),
        WEEKEND("WEEKEND", 9);
    private String apiValue;
    private Integer intValue;

    @JsonValue
    public String getApiValue() {
        return apiValue;
    }

    private ApiNotificationScheduleDayInWeek(String apiValue, Integer intValue) {
        this.apiValue = apiValue;
        this.intValue = intValue;
    }

}

【问题讨论】:

标签: java json jackson


【解决方案1】:

您正确地执行了序列化部分,所以还有其他问题。由于您使用的是 Jackson2 注释,请确认您使用的是 Jackson2 进行序列化(不是 Jackson1 或任何其他库)。还要进行一般的完整性检查,例如检查您是否编译了类、部署了应用程序等。

至于反序列化,您还需要告诉 Jackson 如何从您的 API 值中获取枚举实例。为此,您可以使用@JsonCreator 注释静态查找方法。示例:

import com.fasterxml.jackson.annotation.JsonCreator;

@JsonCreator
public static ApiNotificationScheduleDayInWeek fromApiValue(String value) {
    if (value == null) {
        return null;
    }
    for (ApiNotificationScheduleDayInWeek day : ApiNotificationScheduleDayInWeek.values()) {
        if (value.equalsIgnoreCase(day.getApiValue())) {
            return day;
        }
    }
    throw new IllegalArgumentException("Invalid API value: " + value);
}

【讨论】:

  • 我是否必须有一个注释为 JsonCreator 的方法才能使 JsonValue 工作?
  • 不,@JsonCreator 用于反序列化。序列化应该只使用@JsonValue。我们在项目中都使用了这两种方法,并且按预期工作。
  • @ArianHosseinzadeh 如果您仍然遇到此问题,请发布其他详细信息,如另一条评论中所述:您如何序列化值,包括 ObjectMapper 的任何配置等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-08
  • 2011-03-08
  • 2015-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-19
相关资源
最近更新 更多