@IntDef Android支持与杰克逊反序列化的公告

时间:2015-06-30 09:08:44

标签: android json jackson android-support-library

使用JacksonAnnotations和Android支持注释。我的POJO是:

@JsonIgnoreProperties(ignoreUnknown = true)
public class Schedule {
    public static final int SUNDAY = 0;
    public static final int MONDAY = 1;
    public static final int TUESDAY = 2;
    public static final int WEDNESDAY = 3;
    public static final int THURSDAY = 4;
    public static final int FRIDAY = 5;
    public static final int SATURDAY = 6;

    private Integer weekday;

    public Schedule() {
    }

    @Weekday
    public Integer getWeekday() {
        return weekday;
    }

    public void setWeekday(@Weekday Integer weekday) {
        this.weekday = weekday;
    }

    @Retention(RetentionPolicy.RUNTIME)
    @IntDef({SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY})
    public @interface Weekday {}
}

从后台获取对象:

{"schedule":{"weekday":"MONDAY"}}

我想要的是将Weekday映射到常量中定义的整数值。有什么方法可以达到这个目的吗?

更新:主要目的是优化(您应该严格避免在Android上使用枚举,就像它说here)。

4 个答案:

答案 0 :(得分:3)

由于你可以指望工作日不会失去控制,因此创建静态地图似乎是一个非常干净的解决方案。提供名为@JsonCreator的{​​{1}}工厂将与杰克逊合作,并play nicely with JAX-RS

fromString

答案 1 :(得分:1)

也许我错过了什么,但为什么不做这样的事情:

public class Schedule {
    public enum Weekday {
        SUNDAY(0),
        MONDAY(1),
        TUESDAY(2),
        WEDNESDAY(3),
        THURSDAY(4),
        FRIDAY(5),
        SATURDAY(6);

        private final Integer weekday;

        Weekday(Integer weekday) {
            this.weekday = weekday;
        }

        public Integer getWeekday() {
            return weekday;
        }
    }

    private Weekday weekday;

    public Integer getWeekday() {
        return weekday.getWeekday();
    }

    public void setWeekday(Weekday weekday) {
        this.weekday = weekday;
    }

}

答案 2 :(得分:0)

如果后端以字符串形式返回"MONDAY",那么您可能不应该使用@IntDef,因为您必须管理将"MONDAY"转换为整数值。

我会尝试使用@StringDef注释,这样您就不必担心后端和客户端应用之间的任何转换。唯一的问题是您需要从后端获得可靠的响应,并提前就命名约定达成一致。

如果您将类型从@IntDef更改为@StringDef,它将如下所示:

@JsonIgnoreProperties(ignoreUnknown = true)
public class Schedule {
    public static final String SUNDAY = "SUNDAY";
    public static final String MONDAY = "MONDAY";
    public static final String TUESDAY = "TUESDAY";
    public static final String WEDNESDAY = "WEDNESDAY";
    public static final String THURSDAY = "THURSDAY";
    public static final String FRIDAY = "FRIDAY";
    public static final String SATURDAY = "SATURDAY";

    private String weekday;

    public Schedule() {
    }

    @Weekday
    public String getWeekday() {
        return weekday;
    }

    public void setWeekday(@Weekday String weekday) {
        this.weekday = weekday;
    }

    @Retention(RetentionPolicy.RUNTIME)
    @StringDef({SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY})
    public @interface Weekday {}
}

答案 3 :(得分:0)

优雅的解决方案是使用Enum。

高效的解决方案是编写一个自定义序列化程序,使用switch语句将周日字符串映射到int,反之亦然。

您还可以使用序列化程序中的反射来访问StringDef注释中的值,但这样会更慢,更不易读。