使用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)。
答案 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
注释中的值,但这样会更慢,更不易读。