如何使用Jackson正确序列化/反序列化java.time.DayOfWeek?
我正在开发一个存储活动日期的应用程序。我使用如何使用Jackson正确序列化/反序列化java.time.DayOfWeek?,java,json,jackson,Java,Json,Jackson,我正在开发一个存储活动日期的应用程序。我使用java.time.DayOfWeek来表示这一天,并将其持久化为字符串(例如MONDAY,MONDAY) Jackson将此类型序列化为字符串,因此JSON表示形式看起来像存储在数据库中的值。但是,我希望将其序列化/反序列化为数值 我尝试使用@JsonFormat,但可用的数字形状基于索引,这是不可取的,因为MONDAY的值是1,而不是0 在这里,编写自定义序列化程序似乎是唯一的解决方案,但我感觉这个问题以前已经以某种方式得到了解决。您可以忽略默认的
java.time.DayOfWeek
来表示这一天,并将其持久化为字符串(例如MONDAY
,MONDAY
)
Jackson将此类型序列化为字符串,因此JSON表示形式看起来像存储在数据库中的值。但是,我希望将其序列化/反序列化为数值
我尝试使用@JsonFormat
,但可用的数字形状基于索引,这是不可取的,因为MONDAY
的值是1
,而不是0
在这里,编写自定义序列化程序似乎是唯一的解决方案,但我感觉这个问题以前已经以某种方式得到了解决。您可以忽略默认的getter,添加一个映射到
DayOfWeek
字段的不同方法。对于setter,您可以创建一个额外的setter,它采用int
而不是enum
下面是一个示例实现:
class MyDate {
private DayOfWeek dow = DayOfWeek.MONDAY;// DayOfWeek.of(LocalDate.now().getDayOfWeek());
@JsonIgnore
public DayOfWeek getDow() {
return dow;
}
public void setDow(int dow) {
this.dow = DayOfWeek.of(dow + 1);
}
@JsonProperty("dow")
public int getDayOfWeekNumber() {
return dow.getValue() - 1; //0 for Monday
}
public void setDow(DayOfWeek dow) {
this.dow = dow;
}
@Override
public String toString() {
return "[dow=" + dow + "]";
}
public static void main(String[] args) throws Exception {
System.out.println(new ObjectMapper().writeValueAsString(new MyDate()));
System.out.println(new ObjectMapper().readValue("{\"dow\":7}", MyDate.class));
}
}
DayOfWeek
不支持自定义每周第一天或其索引。这就是为什么上面的代码使用+/-1
进行移位。为了避免应用程序各层和各部分之间的任何误解,最好使用字符串
表示:星期一
,星期三
,等等。如果您想将此枚举
序列化为int
任何数字都可以,并且同样好。在每一层上,您都需要保留1
是MONDAY
的信息。无论是0
、1
还是10
都无关紧要。在Java
中,我们有日历。星期一
等于2
,DayOfWeek。星期一
等于1
,但也等于WeekFields。ISO
其中星期一
是第一天,而周场。星期日开始
其中星期日
是一周的第一天
如果您需要为MONDAY
定义1
作为所有POJO
类的一般概念,则需要注册自定义序列化程序。自定义序列化程序可能如下所示:
class DayOfWeekSerializer extends StdSerializer<DayOfWeek> {
public DayOfWeekSerializer() {
super(DayOfWeek.class);
}
@Override
public void serialize(DayOfWeek value, JsonGenerator gen, SerializerProvider provider) throws IOException {
gen.writeNumber(value.getValue());
}
}
ObjectMapper createObjectMapper() {
SimpleModule dayOfWeeModule = new SimpleModule("DayOfWeek module");
dayOfWeeModule.addSerializer(DayOfWeek.class, new DayOfWeekSerializer());
dayOfWeeModule.addDeserializer(DayOfWeek.class, new DayOfWeekDeserializer());
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(dayOfWeeModule);
mapper.enable(SerializationFeature.INDENT_OUTPUT);
return mapper;
}
对于以下测试POJO类
:
class Days {
private DayOfWeek monday = DayOfWeek.MONDAY;
private DayOfWeek tuesday = DayOfWeek.TUESDAY;
private DayOfWeek wednesday = DayOfWeek.WEDNESDAY;
private DayOfWeek thursday = DayOfWeek.THURSDAY;
private DayOfWeek friday = DayOfWeek.FRIDAY;
private DayOfWeek saturday = DayOfWeek.SATURDAY;
private DayOfWeek sunday = DayOfWeek.SUNDAY;
// getter, setters, toString
}
用法示例:
ObjectMapper映射器=createObjectMapper()
以上代码打印:
{
"monday" : 1,
"tuesday" : 2,
"wednesday" : 3,
"thursday" : 4,
"friday" : 5,
"saturday" : 6,
"sunday" : 7
}
Days{monday=MONDAY, tuesday=TUESDAY, wednesday=WEDNESDAY, thursday=THURSDAY, friday=FRIDAY, saturday=SATURDAY, sunday=SUNDAY}
String json = mapper.writeValueAsString(new Days());
System.out.println(json);
System.out.println(mapper.readValue(json, Days.class));
{
"monday" : 1,
"tuesday" : 2,
"wednesday" : 3,
"thursday" : 4,
"friday" : 5,
"saturday" : 6,
"sunday" : 7
}
Days{monday=MONDAY, tuesday=TUESDAY, wednesday=WEDNESDAY, thursday=THURSDAY, friday=FRIDAY, saturday=SATURDAY, sunday=SUNDAY}