Чтобы избежать недопонимания между слоями и частями приложения, лучше всего использовать String
представление: MONDAY
, WEDNESDAY
и т. Д. Если вы хотите сериализовать это enum
как int
, любое число в порядкеи как же хорошо.На каждом слое вам нужно хранить информацию, что 1
равно MONDAY
.Будет ли это 0
, 1
или 10
, не имеет значения.В Java
мы имеем Calendar.MONDAY
, равный 2
, DayOfWeek.MONDAY
, равный 1
, но также WeekFields.ISO
, где MONDAY
- первый день и WeekFields.SUNDAY_START
, где SUNDAY
- первый деньнедели.
Если вам нужно определить 1
для MONDAY
как общую идею для всех 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());
}
}
Пользовательский десериализатор:
class DayOfWeekDeserializer extends StdDeserializer<DayOfWeek> {
public DayOfWeekDeserializer() {
super(DayOfWeek.class);
}
@Override
public DayOfWeek deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
return DayOfWeek.of(p.getIntValue());
}
}
Вы можете зарегистрировать их, как показано ниже:
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
:
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 mapper = createObjectMapper ();
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}