Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Jackson正确序列化/反序列化java.time.DayOfWeek?_Java_Json_Jackson - Fatal编程技术网

如何使用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}