Skip to content

Commit df3f16c

Browse files
committed
refactoring to allow differentiating between as-array/as-number serializations (via JsonFormat.shape)
1 parent 1900738 commit df3f16c

File tree

12 files changed

+239
-130
lines changed

12 files changed

+239
-130
lines changed

src/main/java/com/fasterxml/jackson/datatype/joda/ser/DateMidnightSerializer.java

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,22 @@ public class DateMidnightSerializer
2121
{
2222
private static final long serialVersionUID = 1L;
2323

24-
public DateMidnightSerializer() { this(FormatConfig.DEFAULT_LOCAL_DATEONLY_FORMAT); }
25-
public DateMidnightSerializer(JacksonJodaDateFormat format) {
24+
public DateMidnightSerializer() {
25+
this(FormatConfig.DEFAULT_LOCAL_DATEONLY_FORMAT, 0);
26+
}
27+
28+
public DateMidnightSerializer(JacksonJodaDateFormat format,
29+
int shapeOverride) {
2630
// true -> use arrays
27-
super(DateMidnight.class, format, true,
28-
SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
31+
super(DateMidnight.class, format,
32+
SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,
33+
FORMAT_ARRAY, shapeOverride);
2934
}
3035

3136
@Override
32-
public DateMidnightSerializer withFormat(JacksonJodaDateFormat formatter) {
33-
return (_format == formatter) ? this : new DateMidnightSerializer(formatter);
37+
public DateMidnightSerializer withFormat(JacksonJodaDateFormat formatter,
38+
int shapeOverride) {
39+
return new DateMidnightSerializer(formatter, shapeOverride);
3440
}
3541

3642
@Override
@@ -42,15 +48,20 @@ public boolean isEmpty(SerializerProvider provider, DateMidnight value) {
4248
public void serialize(DateMidnight value, JsonGenerator gen,
4349
SerializerProvider provider) throws IOException
4450
{
45-
if (_useTimestamp(provider)) {
51+
switch (_serializationShape(provider)) {
52+
case FORMAT_STRING:
53+
gen.writeString(_format.createFormatterWithLocale(provider).print(value));
54+
break;
55+
case FORMAT_TIMESTAMP:
56+
gen.writeNumber(value.getMillis());
57+
break;
58+
case FORMAT_ARRAY:
4659
// same as with other date-only values
4760
gen.writeStartArray();
4861
gen.writeNumber(value.year().get());
4962
gen.writeNumber(value.monthOfYear().get());
5063
gen.writeNumber(value.dayOfMonth().get());
5164
gen.writeEndArray();
52-
} else {
53-
gen.writeString(_format.createFormatterWithLocale(provider).print(value));
5465
}
5566
}
5667
}

src/main/java/com/fasterxml/jackson/datatype/joda/ser/DateTimeSerializer.java

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,21 +10,27 @@
1010
import com.fasterxml.jackson.datatype.joda.cfg.FormatConfig;
1111
import com.fasterxml.jackson.datatype.joda.cfg.JacksonJodaDateFormat;
1212

13-
public class DateTimeSerializer // non final since 2.6.1
13+
public class DateTimeSerializer
1414
extends JodaDateSerializerBase<DateTime>
1515
{
1616
private static final long serialVersionUID = 1L;
1717

18-
public DateTimeSerializer() { this(FormatConfig.DEFAULT_DATETIME_PRINTER); }
19-
public DateTimeSerializer(JacksonJodaDateFormat format) {
18+
public DateTimeSerializer() {
19+
this(FormatConfig.DEFAULT_DATETIME_PRINTER, 0);
20+
}
21+
22+
public DateTimeSerializer(JacksonJodaDateFormat format,
23+
int shapeOverride) {
2024
// false -> no arrays (numbers)
21-
super(DateTime.class, format, false,
22-
SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
25+
super(DateTime.class, format,
26+
SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, FORMAT_TIMESTAMP,
27+
shapeOverride);
2328
}
2429

2530
@Override
26-
public DateTimeSerializer withFormat(JacksonJodaDateFormat formatter) {
27-
return (_format == formatter) ? this : new DateTimeSerializer(formatter);
31+
public DateTimeSerializer withFormat(JacksonJodaDateFormat formatter,
32+
int shapeOverride) {
33+
return new DateTimeSerializer(formatter, shapeOverride);
2834
}
2935

3036
@Override
@@ -35,16 +41,18 @@ public boolean isEmpty(SerializerProvider prov, DateTime value) {
3541
@Override
3642
public void serialize(DateTime value, JsonGenerator gen, SerializerProvider provider) throws IOException
3743
{
44+
boolean numeric = (_serializationShape(provider) != FORMAT_STRING);
45+
3846
// First: simple, non-timezone-included output
3947
if (!writeWithZoneId(provider)) {
40-
if (_useTimestamp(provider)) {
48+
if (numeric) {
4149
gen.writeNumber(value.getMillis());
4250
} else {
4351
gen.writeString(_format.createFormatter(provider).print(value));
4452
}
4553
} else {
4654
// and then as per [datatype-joda#44], optional TimeZone inclusion
47-
if (_useTimestamp(provider)) {
55+
if (numeric) {
4856
/* 12-Jul-2015, tatu: Initially planned to support "timestamp[zone-id]"
4957
* format as well as textual, but since JSR-310 datatype (Java 8 datetime)
5058
* does not support it, was left out of 2.6.

src/main/java/com/fasterxml/jackson/datatype/joda/ser/DateTimeZoneSerializer.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,5 @@ public void serializeWithType(DateTimeZone value, JsonGenerator g,
3131
typeSer.typeId(value, DateTimeZone.class, JsonToken.VALUE_STRING));
3232
serialize(value, g, provider);
3333
typeSer.writeTypeSuffix(g, typeIdDef);
34-
3534
}
3635
}

src/main/java/com/fasterxml/jackson/datatype/joda/ser/DurationSerializer.java

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import org.joda.time.Duration;
66

77
import com.fasterxml.jackson.core.JsonGenerator;
8+
89
import com.fasterxml.jackson.databind.SerializationFeature;
910
import com.fasterxml.jackson.databind.SerializerProvider;
1011
import com.fasterxml.jackson.datatype.joda.cfg.FormatConfig;
@@ -22,19 +23,21 @@ public class DurationSerializer // non final since 2.6.1
2223
// NOTE: formatter is not really used directly for printing, but we do need
2324
// it as container for numeric/textual distinction
2425

25-
public DurationSerializer() { this(FormatConfig.DEFAULT_DATEONLY_FORMAT); }
26-
public DurationSerializer(JacksonJodaDateFormat formatter) {
26+
public DurationSerializer() { this(FormatConfig.DEFAULT_DATEONLY_FORMAT, 0); }
27+
public DurationSerializer(JacksonJodaDateFormat formatter,
28+
int shapeOverride) {
2729
// false -> no arrays (numbers)
28-
super(Duration.class, formatter, false,
29-
SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPS);
30+
super(Duration.class, formatter,
31+
SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPS,
32+
FORMAT_TIMESTAMP, shapeOverride);
3033
}
3134

3235
@Override
33-
public DurationSerializer withFormat(JacksonJodaDateFormat formatter) {
34-
return (_format == formatter) ? this : new DurationSerializer(formatter);
36+
public DurationSerializer withFormat(JacksonJodaDateFormat formatter,
37+
int shapeOverride) {
38+
return new DurationSerializer(formatter, shapeOverride);
3539
}
3640

37-
// @since 2.5
3841
@Override
3942
public boolean isEmpty(SerializerProvider prov, Duration value) {
4043
return (value.getMillis() == 0L);
@@ -43,10 +46,10 @@ public boolean isEmpty(SerializerProvider prov, Duration value) {
4346
@Override
4447
public void serialize(Duration value, JsonGenerator gen, SerializerProvider provider) throws IOException
4548
{
46-
if (_useTimestamp(provider)) {
47-
gen.writeNumber(value.getMillis());
48-
} else {
49+
if (_serializationShape(provider) == FORMAT_STRING) {
4950
gen.writeString(value.toString());
51+
} else {
52+
gen.writeNumber(value.getMillis());
5053
}
5154
}
5255
}

src/main/java/com/fasterxml/jackson/datatype/joda/ser/InstantSerializer.java

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,17 @@ public class InstantSerializer // non final since 2.6.1
1616
private static final long serialVersionUID = 1L;
1717

1818
// NOTE: formatter not used for printing at all, hence choice doesn't matter
19-
public InstantSerializer() { this(FormatConfig.DEFAULT_TIMEONLY_FORMAT); }
20-
public InstantSerializer(JacksonJodaDateFormat format) {
21-
super(Instant.class, format, false,
22-
SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
19+
public InstantSerializer() { this(FormatConfig.DEFAULT_TIMEONLY_FORMAT, 0); }
20+
public InstantSerializer(JacksonJodaDateFormat format,
21+
int shapeOverride) {
22+
super(Instant.class, format, SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,
23+
FORMAT_TIMESTAMP, shapeOverride);
2324
}
2425

2526
@Override
26-
public InstantSerializer withFormat(JacksonJodaDateFormat formatter) {
27-
return (_format == formatter) ? this : new InstantSerializer(formatter);
27+
public InstantSerializer withFormat(JacksonJodaDateFormat formatter,
28+
int shapeOverride) {
29+
return new InstantSerializer(formatter, shapeOverride);
2830
}
2931

3032
// @since 2.5
@@ -37,10 +39,10 @@ public boolean isEmpty(SerializerProvider prov, Instant value) {
3739
public void serialize(Instant value, JsonGenerator gen, SerializerProvider provider)
3840
throws IOException
3941
{
40-
if (_useTimestamp(provider)) {
41-
gen.writeNumber(value.getMillis());
42-
} else {
42+
if (_serializationShape(provider) == FORMAT_STRING) {
4343
gen.writeString(value.toString());
44+
} else {
45+
gen.writeNumber(value.getMillis());
4446
}
4547
}
4648
}

src/main/java/com/fasterxml/jackson/datatype/joda/ser/IntervalSerializer.java

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,17 @@ public class IntervalSerializer extends JodaDateSerializerBase<Interval>
1616
{
1717
private static final long serialVersionUID = 1L;
1818

19-
public IntervalSerializer() { this(FormatConfig.DEFAULT_DATETIME_PRINTER); }
20-
public IntervalSerializer(JacksonJodaDateFormat format) {
21-
super(Interval.class, format, false,
22-
SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPS);
19+
public IntervalSerializer() { this(FormatConfig.DEFAULT_DATETIME_PRINTER, 0); }
20+
public IntervalSerializer(JacksonJodaDateFormat format,
21+
int shapeOverride) {
22+
super(Interval.class, format, SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPS,
23+
FORMAT_TIMESTAMP, shapeOverride);
2324
}
2425

2526
@Override
26-
public IntervalSerializer withFormat(JacksonJodaDateFormat formatter) {
27-
return (_format == formatter) ? this : new IntervalSerializer(formatter);
27+
public IntervalSerializer withFormat(JacksonJodaDateFormat formatter,
28+
int shapeOverride) {
29+
return new IntervalSerializer(formatter, shapeOverride);
2830
}
2931

3032
@Override
@@ -38,12 +40,13 @@ public void serialize(Interval interval, JsonGenerator gen, SerializerProvider p
3840
// 19-Nov-2014, tatu: Support textual representation similar to what Joda uses
3941
// (and why not exact one? In future we'll make it configurable)
4042
String repr;
41-
if (_useTimestamp(provider)) {
42-
// !!! TODO: maybe allow textual format too?
43-
repr = interval.getStartMillis() + "-" + interval.getEndMillis();
44-
} else {
43+
44+
if (_serializationShape(provider) == FORMAT_STRING) {
4545
DateTimeFormatter f = _format.createFormatter(provider);
4646
repr = f.print(interval.getStart()) + "/" + f.print(interval.getEnd());
47+
} else {
48+
// !!! TODO: maybe allow textual format too?
49+
repr = interval.getStartMillis() + "-" + interval.getEndMillis();
4750
}
4851
gen.writeString(repr);
4952
}

0 commit comments

Comments
 (0)