Skip to content

Commit f829292

Browse files
author
João Cabrita
committed
FasterXML#20 Allow LocalDate to be serialized/deserialized as number (epoch day)
1 parent 9cc6a72 commit f829292

16 files changed

+116
-44
lines changed

datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/LocalDateDeserializer.java

+3
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,9 @@ public LocalDate deserialize(JsonParser parser, DeserializationContext context)
9999
if (parser.hasToken(JsonToken.VALUE_EMBEDDED_OBJECT)) {
100100
return (LocalDate) parser.getEmbeddedObject();
101101
}
102+
if (parser.hasToken(JsonToken.VALUE_NUMBER_INT)) {
103+
return LocalDate.ofEpochDay(parser.getLongValue());
104+
}
102105
throw context.wrongTokenException(parser, handledType(), JsonToken.VALUE_STRING,
103106
"Expected array or string.");
104107
}

datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/ser/DurationSerializer.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package com.fasterxml.jackson.datatype.jsr310.ser;
1818

19+
import com.fasterxml.jackson.annotation.JsonFormat;
1920
import com.fasterxml.jackson.core.JsonGenerator;
2021
import com.fasterxml.jackson.core.JsonParser;
2122
import com.fasterxml.jackson.databind.JavaType;
@@ -49,11 +50,11 @@ private DurationSerializer() {
4950

5051
protected DurationSerializer(DurationSerializer base,
5152
Boolean useTimestamp, DateTimeFormatter dtf) {
52-
super(base, useTimestamp, dtf);
53+
super(base, useTimestamp, dtf, null);
5354
}
5455

5556
@Override
56-
protected DurationSerializer withFormat(Boolean useTimestamp, DateTimeFormatter dtf) {
57+
protected DurationSerializer withFormat(Boolean useTimestamp, DateTimeFormatter dtf, JsonFormat.Shape shape) {
5758
return new DurationSerializer(this, useTimestamp, dtf);
5859
}
5960

datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/ser/InstantSerializer.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package com.fasterxml.jackson.datatype.jsr310.ser;
1818

19+
import com.fasterxml.jackson.annotation.JsonFormat;
1920
import java.time.Instant;
2021
import java.time.OffsetDateTime;
2122
import java.time.ZonedDateTime;
@@ -45,7 +46,10 @@ protected InstantSerializer(InstantSerializer base,
4546
}
4647

4748
@Override
48-
protected JSR310FormattedSerializerBase<Instant> withFormat(Boolean useTimestamp, DateTimeFormatter formatter) {
49+
protected JSR310FormattedSerializerBase<Instant> withFormat(
50+
Boolean useTimestamp,
51+
DateTimeFormatter formatter,
52+
JsonFormat.Shape shape) {
4953
return new InstantSerializer(this, useTimestamp, formatter);
5054
}
5155
}

datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/ser/InstantSerializerBase.java

+5-3
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package com.fasterxml.jackson.datatype.jsr310.ser;
1818

19+
import com.fasterxml.jackson.annotation.JsonFormat;
1920
import java.io.IOException;
2021
import java.time.format.DateTimeFormatter;
2122
import java.time.temporal.Temporal;
@@ -64,16 +65,17 @@ protected InstantSerializerBase(Class<T> supportedType, ToLongFunction<T> getEpo
6465
protected InstantSerializerBase(InstantSerializerBase<T> base,
6566
Boolean useTimestamp, DateTimeFormatter dtf)
6667
{
67-
super(base, useTimestamp, dtf);
68+
super(base, useTimestamp, dtf, null);
6869
defaultFormat = base.defaultFormat;
6970
getEpochMillis = base.getEpochMillis;
7071
getEpochSeconds = base.getEpochSeconds;
7172
getNanoseconds = base.getNanoseconds;
7273
}
7374

7475
@Override
75-
protected abstract JSR310FormattedSerializerBase<?> withFormat(Boolean useTimestamp,
76-
DateTimeFormatter dtf);
76+
protected abstract JSR310FormattedSerializerBase<?> withFormat(
77+
Boolean useTimestamp,
78+
DateTimeFormatter dtf, JsonFormat.Shape shape);
7779

7880
@Override
7981
public void serialize(T value, JsonGenerator generator, SerializerProvider provider) throws IOException

datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/ser/JSR310FormattedSerializerBase.java

+9-4
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ abstract class JSR310FormattedSerializerBase<T>
5555
*/
5656
protected final DateTimeFormatter _formatter;
5757

58+
protected final JsonFormat.Shape _shape;
59+
5860
protected JSR310FormattedSerializerBase(Class<T> supportedType) {
5961
this(supportedType, null);
6062
}
@@ -63,19 +65,22 @@ protected JSR310FormattedSerializerBase(Class<T> supportedType,
6365
DateTimeFormatter formatter) {
6466
super(supportedType);
6567
_useTimestamp = null;
68+
_shape = null;
6669
_formatter = formatter;
6770
}
6871

6972
protected JSR310FormattedSerializerBase(JSR310FormattedSerializerBase<?> base,
70-
Boolean useTimestamp, DateTimeFormatter dtf)
73+
Boolean useTimestamp, DateTimeFormatter dtf, JsonFormat.Shape shape)
7174
{
7275
super(base.handledType());
7376
_useTimestamp = useTimestamp;
7477
_formatter = dtf;
78+
_shape = shape;
7579
}
7680

7781
protected abstract JSR310FormattedSerializerBase<?> withFormat(Boolean useTimestamp,
78-
DateTimeFormatter dtf);
82+
DateTimeFormatter dtf,
83+
JsonFormat.Shape shape);
7984

8085
/**
8186
* @since 2.8
@@ -118,8 +123,8 @@ public JsonSerializer<?> createContextual(SerializerProvider prov,
118123
}
119124
}
120125
JSR310FormattedSerializerBase<?> ser = this;
121-
if ((useTimestamp != _useTimestamp) || (dtf != _formatter)) {
122-
ser = ser.withFormat(useTimestamp, dtf);
126+
if ((shape != _shape) || (useTimestamp != _useTimestamp) || (dtf != _formatter)) {
127+
ser = ser.withFormat(useTimestamp, dtf, shape);
123128
}
124129
Boolean writeZoneId = format.getFeature(JsonFormat.Feature.WRITE_DATES_WITH_ZONE_ID);
125130
if (writeZoneId != null) {

datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/ser/LocalDateSerializer.java

+14-9
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package com.fasterxml.jackson.datatype.jsr310.ser;
1818

19+
import com.fasterxml.jackson.annotation.JsonFormat;
1920
import java.io.IOException;
2021
import java.time.LocalDate;
2122
import java.time.format.DateTimeFormatter;
@@ -44,28 +45,32 @@ protected LocalDateSerializer() {
4445
}
4546

4647
protected LocalDateSerializer(LocalDateSerializer base,
47-
Boolean useTimestamp, DateTimeFormatter dtf) {
48-
super(base, useTimestamp, dtf);
48+
Boolean useTimestamp, DateTimeFormatter dtf, JsonFormat.Shape shape) {
49+
super(base, useTimestamp, dtf, shape);
4950
}
5051

5152
public LocalDateSerializer(DateTimeFormatter formatter) {
5253
super(LocalDate.class, formatter);
5354
}
5455

5556
@Override
56-
protected LocalDateSerializer withFormat(Boolean useTimestamp, DateTimeFormatter dtf) {
57-
return new LocalDateSerializer(this, useTimestamp, dtf);
57+
protected LocalDateSerializer withFormat(Boolean useTimestamp, DateTimeFormatter dtf, JsonFormat.Shape shape) {
58+
return new LocalDateSerializer(this, useTimestamp, dtf, shape);
5859
}
5960

6061
@Override
6162
public void serialize(LocalDate date, JsonGenerator generator, SerializerProvider provider) throws IOException
6263
{
6364
if (useTimestamp(provider)) {
64-
generator.writeStartArray();
65-
generator.writeNumber(date.getYear());
66-
generator.writeNumber(date.getMonthValue());
67-
generator.writeNumber(date.getDayOfMonth());
68-
generator.writeEndArray();
65+
if (_shape == JsonFormat.Shape.NUMBER_INT) {
66+
generator.writeNumber(date.toEpochDay());
67+
} else {
68+
generator.writeStartArray();
69+
generator.writeNumber(date.getYear());
70+
generator.writeNumber(date.getMonthValue());
71+
generator.writeNumber(date.getDayOfMonth());
72+
generator.writeEndArray();
73+
}
6974
} else {
7075
String str = (_formatter == null) ? date.toString() : date.format(_formatter);
7176
generator.writeString(str);

datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/ser/LocalDateTimeSerializer.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package com.fasterxml.jackson.datatype.jsr310.ser;
1818

19+
import com.fasterxml.jackson.annotation.JsonFormat;
1920
import com.fasterxml.jackson.core.JsonGenerator;
2021
import com.fasterxml.jackson.databind.SerializationFeature;
2122
import com.fasterxml.jackson.databind.SerializerProvider;
@@ -46,11 +47,11 @@ public LocalDateTimeSerializer(DateTimeFormatter f) {
4647
}
4748

4849
private LocalDateTimeSerializer(LocalDateTimeSerializer base, Boolean useTimestamp, DateTimeFormatter f) {
49-
super(base, useTimestamp, f);
50+
super(base, useTimestamp, f, null);
5051
}
5152

5253
@Override
53-
protected JSR310FormattedSerializerBase<LocalDateTime> withFormat(Boolean useTimestamp, DateTimeFormatter f) {
54+
protected JSR310FormattedSerializerBase<LocalDateTime> withFormat(Boolean useTimestamp, DateTimeFormatter f, JsonFormat.Shape shape) {
5455
return new LocalDateTimeSerializer(this, useTimestamp, f);
5556
}
5657

datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/ser/LocalTimeSerializer.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package com.fasterxml.jackson.datatype.jsr310.ser;
1818

19+
import com.fasterxml.jackson.annotation.JsonFormat;
1920
import com.fasterxml.jackson.core.JsonGenerator;
2021
import com.fasterxml.jackson.databind.SerializationFeature;
2122
import com.fasterxml.jackson.databind.SerializerProvider;
@@ -46,11 +47,11 @@ public LocalTimeSerializer(DateTimeFormatter formatter) {
4647
}
4748

4849
protected LocalTimeSerializer(LocalTimeSerializer base, Boolean useTimestamp, DateTimeFormatter formatter) {
49-
super(base, useTimestamp, formatter);
50+
super(base, useTimestamp, formatter, null);
5051
}
5152

5253
@Override
53-
protected JSR310FormattedSerializerBase<LocalTime> withFormat(Boolean useTimestamp, DateTimeFormatter dtf) {
54+
protected JSR310FormattedSerializerBase<LocalTime> withFormat(Boolean useTimestamp, DateTimeFormatter dtf, JsonFormat.Shape shape) {
5455
return new LocalTimeSerializer(this, useTimestamp, dtf);
5556
}
5657

datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/ser/MonthDaySerializer.java

+6-7
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,17 @@
1616

1717
package com.fasterxml.jackson.datatype.jsr310.ser;
1818

19-
import java.io.IOException;
20-
import java.time.MonthDay;
21-
import java.time.format.DateTimeFormatter;
22-
19+
import com.fasterxml.jackson.annotation.JsonFormat;
2320
import com.fasterxml.jackson.core.JsonGenerator;
24-
2521
import com.fasterxml.jackson.databind.JavaType;
2622
import com.fasterxml.jackson.databind.JsonMappingException;
2723
import com.fasterxml.jackson.databind.SerializerProvider;
2824
import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonFormatVisitorWrapper;
2925
import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonStringFormatVisitor;
3026
import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonValueFormat;
27+
import java.io.IOException;
28+
import java.time.MonthDay;
29+
import java.time.format.DateTimeFormatter;
3130

3231
/**
3332
* Serializer for Java 8 temporal {@link MonthDay}s.
@@ -53,11 +52,11 @@ public MonthDaySerializer(DateTimeFormatter formatter) {
5352
}
5453

5554
private MonthDaySerializer(MonthDaySerializer base, Boolean useTimestamp, DateTimeFormatter formatter) {
56-
super(base, useTimestamp, formatter);
55+
super(base, useTimestamp, formatter, null);
5756
}
5857

5958
@Override
60-
protected MonthDaySerializer withFormat(Boolean useTimestamp, DateTimeFormatter formatter) {
59+
protected MonthDaySerializer withFormat(Boolean useTimestamp, DateTimeFormatter formatter, JsonFormat.Shape shape) {
6160
return new MonthDaySerializer(this, useTimestamp, formatter);
6261
}
6362

datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/ser/OffsetDateTimeSerializer.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.fasterxml.jackson.datatype.jsr310.ser;
22

3+
import com.fasterxml.jackson.annotation.JsonFormat;
34
import java.time.OffsetDateTime;
45
import java.time.format.DateTimeFormatter;
56

@@ -21,7 +22,10 @@ protected OffsetDateTimeSerializer(OffsetDateTimeSerializer base,
2122
}
2223

2324
@Override
24-
protected JSR310FormattedSerializerBase<?> withFormat(Boolean useTimestamp, DateTimeFormatter formatter) {
25+
protected JSR310FormattedSerializerBase<?> withFormat(
26+
Boolean useTimestamp,
27+
DateTimeFormatter formatter,
28+
JsonFormat.Shape shape) {
2529
return new OffsetDateTimeSerializer(this, useTimestamp, formatter);
2630
}
2731
}

datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/ser/OffsetTimeSerializer.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package com.fasterxml.jackson.datatype.jsr310.ser;
1818

19+
import com.fasterxml.jackson.annotation.JsonFormat;
1920
import com.fasterxml.jackson.core.JsonGenerator;
2021
import com.fasterxml.jackson.databind.SerializationFeature;
2122
import com.fasterxml.jackson.databind.SerializerProvider;
@@ -43,11 +44,11 @@ protected OffsetTimeSerializer() {
4344

4445
protected OffsetTimeSerializer(OffsetTimeSerializer base,
4546
Boolean useTimestamp, DateTimeFormatter dtf) {
46-
super(base, useTimestamp, dtf);
47+
super(base, useTimestamp, dtf, null);
4748
}
4849

4950
@Override
50-
protected OffsetTimeSerializer withFormat(Boolean useTimestamp, DateTimeFormatter dtf) {
51+
protected OffsetTimeSerializer withFormat(Boolean useTimestamp, DateTimeFormatter dtf, JsonFormat.Shape shape) {
5152
return new OffsetTimeSerializer(this, useTimestamp, dtf);
5253
}
5354

datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/ser/YearMonthSerializer.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package com.fasterxml.jackson.datatype.jsr310.ser;
1818

19+
import com.fasterxml.jackson.annotation.JsonFormat;
1920
import java.io.IOException;
2021
import java.time.YearMonth;
2122
import java.time.format.DateTimeFormatter;
@@ -50,11 +51,11 @@ public YearMonthSerializer(DateTimeFormatter formatter) {
5051
}
5152

5253
private YearMonthSerializer(YearMonthSerializer base, Boolean useTimestamp, DateTimeFormatter formatter) {
53-
super(base, useTimestamp, formatter);
54+
super(base, useTimestamp, formatter, null);
5455
}
5556

5657
@Override
57-
protected YearMonthSerializer withFormat(Boolean useTimestamp, DateTimeFormatter formatter) {
58+
protected YearMonthSerializer withFormat(Boolean useTimestamp, DateTimeFormatter formatter, JsonFormat.Shape shape) {
5859
return new YearMonthSerializer(this, useTimestamp, formatter);
5960
}
6061

datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/ser/YearSerializer.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package com.fasterxml.jackson.datatype.jsr310.ser;
1818

19+
import com.fasterxml.jackson.annotation.JsonFormat;
1920
import com.fasterxml.jackson.core.JsonGenerator;
2021
import com.fasterxml.jackson.core.JsonParser;
2122
import com.fasterxml.jackson.databind.JavaType;
@@ -49,11 +50,11 @@ public YearSerializer(DateTimeFormatter formatter) {
4950
}
5051

5152
protected YearSerializer(YearSerializer base, Boolean useTimestamp, DateTimeFormatter formatter) {
52-
super(base, useTimestamp, formatter);
53+
super(base, useTimestamp, formatter, null);
5354
}
5455

5556
@Override
56-
protected YearSerializer withFormat(Boolean useTimestamp, DateTimeFormatter formatter) {
57+
protected YearSerializer withFormat(Boolean useTimestamp, DateTimeFormatter formatter, JsonFormat.Shape shape) {
5758
return new YearSerializer(this, useTimestamp, formatter);
5859
}
5960

datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/ser/ZonedDateTimeSerializer.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.fasterxml.jackson.datatype.jsr310.ser;
22

3+
import com.fasterxml.jackson.annotation.JsonFormat;
34
import java.io.IOException;
45
import java.time.ZonedDateTime;
56
import java.time.format.DateTimeFormatter;
@@ -39,7 +40,10 @@ protected ZonedDateTimeSerializer(ZonedDateTimeSerializer base,
3940
}
4041

4142
@Override
42-
protected JSR310FormattedSerializerBase<?> withFormat(Boolean useTimestamp, DateTimeFormatter formatter) {
43+
protected JSR310FormattedSerializerBase<?> withFormat(
44+
Boolean useTimestamp,
45+
DateTimeFormatter formatter,
46+
JsonFormat.Shape shape) {
4347
return new ZonedDateTimeSerializer(this, useTimestamp, formatter, _writeZoneId);
4448
}
4549

datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/ser/ZonedDateTimeWithZoneIdSerializer.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.fasterxml.jackson.datatype.jsr310.ser;
22

3+
import com.fasterxml.jackson.annotation.JsonFormat;
34
import java.time.ZonedDateTime;
45
import java.time.format.DateTimeFormatter;
56

@@ -30,7 +31,10 @@ protected ZonedDateTimeWithZoneIdSerializer(ZonedDateTimeWithZoneIdSerializer ba
3031
}
3132

3233
@Override
33-
protected JSR310FormattedSerializerBase<?> withFormat(Boolean useTimestamp, DateTimeFormatter formatter) {
34+
protected JSR310FormattedSerializerBase<?> withFormat(
35+
Boolean useTimestamp,
36+
DateTimeFormatter formatter,
37+
JsonFormat.Shape shape) {
3438
return new ZonedDateTimeWithZoneIdSerializer(this, useTimestamp, formatter);
3539
}
3640

0 commit comments

Comments
 (0)