Skip to content

Commit 9e07aa0

Browse files
committed
Fix #46
1 parent 8724ec5 commit 9e07aa0

File tree

11 files changed

+127
-68
lines changed

11 files changed

+127
-68
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
* @author Nick Williams
2929
* @since 2.2
3030
*/
31-
public final class InstantSerializer extends InstantSerializerBase<Instant>
31+
public class InstantSerializer extends InstantSerializerBase<Instant>
3232
{
3333
private static final long serialVersionUID = 1L;
3434

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.util.Locale;
2222

2323
import com.fasterxml.jackson.annotation.JsonFormat;
24+
import com.fasterxml.jackson.annotation.JsonFormat.Shape;
2425

2526
import com.fasterxml.jackson.databind.*;
2627
import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonArrayFormatVisitor;
@@ -171,6 +172,14 @@ protected boolean useTimestamp(SerializerProvider provider) {
171172
if (_useTimestamp != null) {
172173
return _useTimestamp.booleanValue();
173174
}
175+
if (_shape != null) {
176+
if (_shape == Shape.STRING) {
177+
return false;
178+
}
179+
if (_shape == Shape.NUMBER_INT) {
180+
return true;
181+
}
182+
}
174183
// assume that explicit formatter definition implies use of textual format
175184
if (_formatter != null) {
176185
return false;

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

Lines changed: 37 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,12 @@
2323

2424
import com.fasterxml.jackson.core.JsonGenerator;
2525
import com.fasterxml.jackson.core.JsonToken;
26+
import com.fasterxml.jackson.core.type.WritableTypeId;
2627
import com.fasterxml.jackson.databind.*;
2728
import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonFormatVisitorWrapper;
2829
import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonStringFormatVisitor;
2930
import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonValueFormat;
31+
import com.fasterxml.jackson.databind.jsontype.TypeSerializer;
3032

3133
/**
3234
* Serializer for Java 8 temporal {@link LocalDate}s.
@@ -59,24 +61,49 @@ protected LocalDateSerializer withFormat(Boolean useTimestamp, DateTimeFormatter
5961
}
6062

6163
@Override
62-
public void serialize(LocalDate date, JsonGenerator generator, SerializerProvider provider) throws IOException
64+
public void serialize(LocalDate date, JsonGenerator g, SerializerProvider provider) throws IOException
6365
{
6466
if (useTimestamp(provider)) {
6567
if (_shape == JsonFormat.Shape.NUMBER_INT) {
66-
generator.writeNumber(date.toEpochDay());
68+
g.writeNumber(date.toEpochDay());
6769
} else {
68-
generator.writeStartArray();
69-
generator.writeNumber(date.getYear());
70-
generator.writeNumber(date.getMonthValue());
71-
generator.writeNumber(date.getDayOfMonth());
72-
generator.writeEndArray();
70+
g.writeStartArray();
71+
_serializeAsArrayContents(date, g, provider);
72+
g.writeEndArray();
7373
}
7474
} else {
75-
String str = (_formatter == null) ? date.toString() : date.format(_formatter);
76-
generator.writeString(str);
75+
g.writeString((_formatter == null) ? date.toString() : date.format(_formatter));
7776
}
7877
}
79-
78+
79+
@Override
80+
public void serializeWithType(LocalDate value, JsonGenerator g,
81+
SerializerProvider provider, TypeSerializer typeSer) throws IOException
82+
{
83+
WritableTypeId typeIdDef = typeSer.writeTypePrefix(g,
84+
typeSer.typeId(value, serializationShape(provider)));
85+
// need to write out to avoid double-writing array markers
86+
switch (typeIdDef.valueShape) {
87+
case START_ARRAY:
88+
_serializeAsArrayContents(value, g, provider);
89+
break;
90+
case VALUE_NUMBER_INT:
91+
g.writeNumber(value.toEpochDay());
92+
break;
93+
default:
94+
g.writeString((_formatter == null) ? value.toString() : value.format(_formatter));
95+
}
96+
typeSer.writeTypeSuffix(g, typeIdDef);
97+
}
98+
99+
protected void _serializeAsArrayContents(LocalDate value, JsonGenerator g,
100+
SerializerProvider provider) throws IOException
101+
{
102+
g.writeNumber(value.getYear());
103+
g.writeNumber(value.getMonthValue());
104+
g.writeNumber(value.getDayOfMonth());
105+
}
106+
80107
@Override
81108
public void acceptJsonFormatVisitor(JsonFormatVisitorWrapper visitor, JavaType typeHint) throws JsonMappingException
82109
{

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@ protected JSR310FormattedSerializerBase<LocalDateTime> withFormat(Boolean useTim
5858
return new LocalDateTimeSerializer(this, useTimestamp, f);
5959
}
6060

61-
// since 2.7: TODO in 2.8; change to use per-type defaulting
6261
protected DateTimeFormatter _defaultFormatter() {
6362
return DateTimeFormatter.ISO_LOCAL_DATE_TIME;
6463
}

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

Lines changed: 29 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,18 @@
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+
1923
import com.fasterxml.jackson.annotation.JsonFormat;
24+
2025
import com.fasterxml.jackson.core.JsonGenerator;
2126
import com.fasterxml.jackson.core.JsonToken;
22-
import com.fasterxml.jackson.databind.JavaType;
23-
import com.fasterxml.jackson.databind.JsonMappingException;
27+
import com.fasterxml.jackson.core.type.WritableTypeId;
28+
2429
import com.fasterxml.jackson.databind.SerializerProvider;
25-
import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonFormatVisitorWrapper;
26-
import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonStringFormatVisitor;
27-
import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonValueFormat;
28-
import java.io.IOException;
29-
import java.time.MonthDay;
30-
import java.time.format.DateTimeFormatter;
30+
import com.fasterxml.jackson.databind.jsontype.TypeSerializer;
3131

3232
/**
3333
* Serializer for Java 8 temporal {@link MonthDay}s.
@@ -62,33 +62,38 @@ protected MonthDaySerializer withFormat(Boolean useTimestamp, DateTimeFormatter
6262
}
6363

6464
@Override
65-
public void serialize(MonthDay value, JsonGenerator generator, SerializerProvider provider)
65+
public void serialize(MonthDay value, JsonGenerator g, SerializerProvider provider)
6666
throws IOException
6767
{
6868
if (_useTimestampExplicitOnly(provider)) {
69-
generator.writeStartArray();
70-
generator.writeNumber(value.getMonthValue());
71-
generator.writeNumber(value.getDayOfMonth());
72-
generator.writeEndArray();
69+
g.writeStartArray();
70+
_serializeAsArrayContents(value, g, provider);
71+
g.writeEndArray();
7372
} else {
74-
String str = (_formatter == null) ? value.toString() : value.format(_formatter);
75-
generator.writeString(str);
73+
g.writeString((_formatter == null) ? value.toString() : value.format(_formatter));
7674
}
7775
}
7876

7977
@Override
80-
protected void _acceptTimestampVisitor(JsonFormatVisitorWrapper visitor, JavaType typeHint) throws JsonMappingException
78+
public void serializeWithType(MonthDay value, JsonGenerator g,
79+
SerializerProvider provider, TypeSerializer typeSer) throws IOException
8180
{
82-
SerializerProvider provider = visitor.getProvider();
83-
boolean useTimestamp = (provider != null) && _useTimestampExplicitOnly(provider);
84-
if (useTimestamp) {
85-
_acceptTimestampVisitor(visitor, typeHint);
81+
WritableTypeId typeIdDef = typeSer.writeTypePrefix(g,
82+
typeSer.typeId(value, serializationShape(provider)));
83+
// need to write out to avoid double-writing array markers
84+
if (typeIdDef.valueShape == JsonToken.START_ARRAY) {
85+
_serializeAsArrayContents(value, g, provider);
8686
} else {
87-
JsonStringFormatVisitor v2 = visitor.expectStringFormat(typeHint);
88-
if (v2 != null) {
89-
v2.format(JsonValueFormat.DATE_TIME);
90-
}
87+
g.writeString((_formatter == null) ? value.toString() : value.format(_formatter));
9188
}
89+
typeSer.writeTypeSuffix(g, typeIdDef);
90+
}
91+
92+
protected void _serializeAsArrayContents(MonthDay value, JsonGenerator g,
93+
SerializerProvider provider) throws IOException
94+
{
95+
g.writeNumber(value.getMonthValue());
96+
g.writeNumber(value.getDayOfMonth());
9297
}
9398

9499
@Override // since 2.9

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

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,14 @@
2323

2424
import com.fasterxml.jackson.core.JsonGenerator;
2525
import com.fasterxml.jackson.core.JsonToken;
26+
import com.fasterxml.jackson.core.type.WritableTypeId;
2627
import com.fasterxml.jackson.databind.JavaType;
2728
import com.fasterxml.jackson.databind.JsonMappingException;
2829
import com.fasterxml.jackson.databind.SerializerProvider;
2930
import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonFormatVisitorWrapper;
3031
import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonStringFormatVisitor;
3132
import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonValueFormat;
33+
import com.fasterxml.jackson.databind.jsontype.TypeSerializer;
3234

3335
/**
3436
* Serializer for Java 8 temporal {@link YearMonth}s.
@@ -62,18 +64,37 @@ protected YearMonthSerializer withFormat(Boolean useTimestamp, DateTimeFormatter
6264
}
6365

6466
@Override
65-
public void serialize(YearMonth yearMonth, JsonGenerator generator,
66-
SerializerProvider provider) throws IOException
67+
public void serialize(YearMonth value, JsonGenerator g, SerializerProvider provider) throws IOException
6768
{
6869
if (useTimestamp(provider)) {
69-
generator.writeStartArray();
70-
generator.writeNumber(yearMonth.getYear());
71-
generator.writeNumber(yearMonth.getMonthValue());
72-
generator.writeEndArray();
70+
g.writeStartArray();
71+
_serializeAsArrayContents(value, g, provider);
72+
g.writeEndArray();
73+
return;
74+
}
75+
g.writeString((_formatter == null) ? value.toString() : value.format(_formatter));
76+
}
77+
78+
@Override
79+
public void serializeWithType(YearMonth value, JsonGenerator g,
80+
SerializerProvider provider, TypeSerializer typeSer) throws IOException
81+
{
82+
WritableTypeId typeIdDef = typeSer.writeTypePrefix(g,
83+
typeSer.typeId(value, serializationShape(provider)));
84+
// need to write out to avoid double-writing array markers
85+
if (typeIdDef.valueShape == JsonToken.START_ARRAY) {
86+
_serializeAsArrayContents(value, g, provider);
7387
} else {
74-
String str = (_formatter == null) ? yearMonth.toString() : yearMonth.format(_formatter);
75-
generator.writeString(str);
88+
g.writeString((_formatter == null) ? value.toString() : value.format(_formatter));
7689
}
90+
typeSer.writeTypeSuffix(g, typeIdDef);
91+
}
92+
93+
protected void _serializeAsArrayContents(YearMonth value, JsonGenerator g,
94+
SerializerProvider provider) throws IOException
95+
{
96+
g.writeNumber(value.getYear());
97+
g.writeNumber(value.getMonthValue());
7798
}
7899

79100
@Override

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,11 @@
1717
package com.fasterxml.jackson.datatype.jsr310.ser;
1818

1919
import com.fasterxml.jackson.annotation.JsonFormat;
20+
2021
import com.fasterxml.jackson.core.JsonGenerator;
2122
import com.fasterxml.jackson.core.JsonParser;
2223
import com.fasterxml.jackson.core.JsonToken;
24+
2325
import com.fasterxml.jackson.databind.JavaType;
2426
import com.fasterxml.jackson.databind.JsonMappingException;
2527
import com.fasterxml.jackson.databind.SerializerProvider;
@@ -70,8 +72,10 @@ public void serialize(Year year, JsonGenerator generator, SerializerProvider pro
7072
}
7173
}
7274

75+
// Override because we have String/Int, NOT String/Array
7376
@Override
74-
protected void _acceptTimestampVisitor(JsonFormatVisitorWrapper visitor, JavaType typeHint) throws JsonMappingException
77+
protected void _acceptTimestampVisitor(JsonFormatVisitorWrapper visitor, JavaType typeHint)
78+
throws JsonMappingException
7579
{
7680
JsonIntegerFormatVisitor v2 = visitor.expectIntegerFormat(typeHint);
7781
if (v2 != null) {

datetime/src/test/java/com/fasterxml/jackson/datatype/jsr310/ModuleTestBase.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public class ModuleTestBase
1111
final static String NO_NANOSECS_SER = "0.0";
1212
final static String NO_NANOSECS_SUFFIX = ".000000000";
1313

14-
protected ObjectMapper newMapper() {
14+
protected static ObjectMapper newMapper() {
1515
return new ObjectMapper()
1616
.registerModule(new JavaTimeModule());
1717
}

datetime/src/test/java/com/fasterxml/jackson/datatype/jsr310/ser/LocalDateSerTest.java

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@
1818

1919
import com.fasterxml.jackson.annotation.JsonFormat;
2020
import com.fasterxml.jackson.annotation.JsonTypeInfo;
21+
2122
import com.fasterxml.jackson.databind.JsonMappingException;
2223
import com.fasterxml.jackson.databind.ObjectMapper;
2324
import com.fasterxml.jackson.databind.SerializationFeature;
24-
import com.fasterxml.jackson.databind.jsontype.impl.StdTypeResolverBuilder;
2525
import com.fasterxml.jackson.datatype.jsr310.MockObjectConfiguration;
2626
import com.fasterxml.jackson.datatype.jsr310.ModuleTestBase;
2727

@@ -66,10 +66,10 @@ public VanillaWrapper() { }
6666
}
6767

6868
// [modules-java8#46]
69-
@JsonTypeInfo(use = JsonTypeInfo.Id.NONE)
7069
static class Holder46 {
7170
public LocalDate localDate;
7271

72+
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.WRAPPER_OBJECT)
7373
public Object object;
7474

7575
public Holder46(LocalDate localDate, Object object) {
@@ -283,19 +283,13 @@ public void testCustomFormatToEpochDay() throws Exception
283283
}
284284

285285
// [modules-java8#46]
286+
@Test
286287
public void testPolymorphicSerialization() throws Exception
287288
{
288289
ObjectMapper mapper = newMapper();
289-
StdTypeResolverBuilder typeResolverBuilder =
290-
new ObjectMapper.DefaultTypeResolverBuilder(ObjectMapper.DefaultTyping.NON_FINAL)
291-
.init(JsonTypeInfo.Id.CLASS, null)
292-
.inclusion(JsonTypeInfo.As.WRAPPER_OBJECT);
293-
294-
mapper = new ObjectMapper();
295-
mapper.setDefaultTyping(typeResolverBuilder);
296290
final LocalDate localDate = LocalDate.of(2017, 12, 5);
297-
String dateHolderStr = mapper.writeValueAsString(new Holder46(localDate, localDate));
291+
String json = mapper.writeValueAsString(new Holder46(localDate, localDate));
298292
assertEquals(aposToQuotes("{\"localDate\":[2017,12,5],\"object\":{\"java.time.LocalDate\":[2017,12,5]}}"),
299-
dateHolderStr);
293+
json);
300294
}
301295
}

datetime/src/test/java/com/fasterxml/jackson/datatype/jsr310/TestYearMonthSerialization.java renamed to datetime/src/test/java/com/fasterxml/jackson/datatype/jsr310/ser/YearMonthSerializationTest.java

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
* limitations under the license.
1515
*/
1616

17-
package com.fasterxml.jackson.datatype.jsr310;
17+
package com.fasterxml.jackson.datatype.jsr310.ser;
1818

1919
import static org.junit.Assert.assertEquals;
2020
import static org.junit.Assert.assertNotNull;
@@ -29,11 +29,12 @@
2929
import com.fasterxml.jackson.annotation.JsonProperty;
3030
import com.fasterxml.jackson.databind.ObjectMapper;
3131
import com.fasterxml.jackson.databind.SerializationFeature;
32+
import com.fasterxml.jackson.datatype.jsr310.MockObjectConfiguration;
33+
import com.fasterxml.jackson.datatype.jsr310.ModuleTestBase;
3234

33-
import org.junit.Before;
3435
import org.junit.Test;
3536

36-
public class TestYearMonthSerialization
37+
public class YearMonthSerializationTest
3738
extends ModuleTestBase
3839
{
3940
private static class SimpleAggregate
@@ -49,14 +50,7 @@ private static class SimpleAggregate
4950
}
5051
}
5152

52-
private ObjectMapper MAPPER;
53-
54-
@Before
55-
public void setUp()
56-
{
57-
this.MAPPER = new ObjectMapper();
58-
this.MAPPER.registerModule(new JavaTimeModule());
59-
}
53+
private final ObjectMapper MAPPER = newMapper();
6054

6155
@Test
6256
public void testSerializationAsTimestamp01() throws Exception

0 commit comments

Comments
 (0)