Skip to content
This repository was archived by the owner on Nov 7, 2019. It is now read-only.

Commit c1be50d

Browse files
committed
Fix #50
1 parent 9386808 commit c1be50d

File tree

6 files changed

+64
-29
lines changed

6 files changed

+64
-29
lines changed

release-notes/CREDITS

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,3 +47,7 @@ jukkasi@github:
4747
Ken Southerland (crowmagnumb@github):
4848
* Reported #45: Problem Deserializing `java.time.OffsetTime` from JSON Array
4949
(2.6.3)
50+
51+
Peter Royal (osi@github)
52+
* Reported #50: `Instant` schema representation is incorrect for timestamps serialization
53+
(2.6.4)

release-notes/VERSION

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@ Project: jackson-datatype-jsr310
33
=== Releases ===
44
------------------------------------------------------------------------
55

6+
2.6.4 (not yet released)
7+
8+
#50: `Instant` schema representation is incorrect for timestamps serialization
9+
(reported by Peter R)
10+
611
2.6.3 (12-Oct-2015)
712

813
#44: Allows users to pass a custom DateTimeFormatter for the ZonedDateTimeSerializer

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

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,23 @@
1616

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

19-
import com.fasterxml.jackson.core.JsonGenerator;
20-
import com.fasterxml.jackson.databind.SerializationFeature;
21-
import com.fasterxml.jackson.databind.SerializerProvider;
22-
import com.fasterxml.jackson.datatype.jsr310.DecimalUtils;
23-
2419
import java.io.IOException;
2520
import java.time.format.DateTimeFormatter;
2621
import java.time.temporal.Temporal;
2722
import java.util.function.ToIntFunction;
2823
import java.util.function.ToLongFunction;
2924

25+
import com.fasterxml.jackson.core.JsonGenerator;
26+
import com.fasterxml.jackson.core.JsonParser.NumberType;
27+
import com.fasterxml.jackson.databind.JavaType;
28+
import com.fasterxml.jackson.databind.JsonMappingException;
29+
import com.fasterxml.jackson.databind.SerializationFeature;
30+
import com.fasterxml.jackson.databind.SerializerProvider;
31+
import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonFormatVisitorWrapper;
32+
import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonIntegerFormatVisitor;
33+
import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonNumberFormatVisitor;
34+
import com.fasterxml.jackson.datatype.jsr310.DecimalUtils;
35+
3036
/**
3137
* Base class for serializers used for {@link java.time.Instant} and related types.
3238
*/
@@ -93,4 +99,24 @@ public void serialize(T value, JsonGenerator generator, SerializerProvider provi
9399
generator.writeString(str);
94100
}
95101
}
102+
103+
// Overridden to ensure that our timestamp handling is as expected
104+
@Override
105+
protected void _acceptTimestampVisitor(JsonFormatVisitorWrapper visitor, JavaType typeHint)
106+
throws JsonMappingException
107+
{
108+
SerializerProvider prov = visitor.getProvider();
109+
if ((prov != null) &&
110+
prov.isEnabled(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS)) {
111+
JsonNumberFormatVisitor v2 = visitor.expectNumberFormat(typeHint);
112+
if (v2 != null) {
113+
v2.numberType(NumberType.BIG_DECIMAL);
114+
}
115+
} else {
116+
JsonIntegerFormatVisitor v2 = visitor.expectIntegerFormat(typeHint);
117+
if (v2 != null) {
118+
v2.numberType(NumberType.LONG);
119+
}
120+
}
121+
}
96122
}

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

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -123,22 +123,11 @@ public JsonSerializer<?> createContextual(SerializerProvider prov,
123123
@Override
124124
public JsonNode getSchema(SerializerProvider provider, Type typeHint)
125125
{
126-
return this.createSchemaNode(
126+
return createSchemaNode(
127127
provider.isEnabled(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) ? "array" : "string", true
128128
);
129129
}
130130

131-
protected boolean useTimestamp(SerializerProvider provider) {
132-
if (_useTimestamp != null) {
133-
return _useTimestamp.booleanValue();
134-
}
135-
// assume that explicit formatter definition implies use of textual format
136-
if (_formatter != null) {
137-
return false;
138-
}
139-
return provider.isEnabled(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
140-
}
141-
142131
@Override
143132
public void acceptJsonFormatVisitor(JsonFormatVisitorWrapper visitor, JavaType typeHint) throws JsonMappingException
144133
{
@@ -153,7 +142,7 @@ public void acceptJsonFormatVisitor(JsonFormatVisitorWrapper visitor, JavaType t
153142
}
154143
}
155144
}
156-
145+
157146
protected void _acceptTimestampVisitor(JsonFormatVisitorWrapper visitor, JavaType typeHint) throws JsonMappingException
158147
{
159148
// By default, most sub-types use JSON Array, so do this:
@@ -162,4 +151,15 @@ protected void _acceptTimestampVisitor(JsonFormatVisitorWrapper visitor, JavaTyp
162151
v2.itemsFormat(JsonFormatTypes.INTEGER);
163152
}
164153
}
154+
155+
protected boolean useTimestamp(SerializerProvider provider) {
156+
if (_useTimestamp != null) {
157+
return _useTimestamp.booleanValue();
158+
}
159+
// assume that explicit formatter definition implies use of textual format
160+
if (_formatter != null) {
161+
return false;
162+
}
163+
return provider.isEnabled(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
164+
}
165165
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
* Serializer for Java 8 temporal {@link LocalDate}s.
2828
*
2929
* @author Nick Williams
30-
* @since 2.2.0
30+
* @since 2.2
3131
*/
3232
public class LocalDateSerializer extends JSR310FormattedSerializerBase<LocalDate>
3333
{

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

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -52,30 +52,30 @@ protected OffsetTimeSerializer withFormat(Boolean useTimestamp, DateTimeFormatte
5252
}
5353

5454
@Override
55-
public void serialize(OffsetTime time, JsonGenerator generator, SerializerProvider provider) throws IOException
55+
public void serialize(OffsetTime time, JsonGenerator gen, SerializerProvider provider) throws IOException
5656
{
5757
if (useTimestamp(provider)) {
58-
generator.writeStartArray();
59-
generator.writeNumber(time.getHour());
60-
generator.writeNumber(time.getMinute());
58+
gen.writeStartArray();
59+
gen.writeNumber(time.getHour());
60+
gen.writeNumber(time.getMinute());
6161
final int secs = time.getSecond();
6262
final int nanos = time.getNano();
6363
if (secs > 0 || nanos > 0)
6464
{
65-
generator.writeNumber(secs);
65+
gen.writeNumber(secs);
6666
if (nanos > 0)
6767
{
6868
if(provider.isEnabled(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS))
69-
generator.writeNumber(nanos);
69+
gen.writeNumber(nanos);
7070
else
71-
generator.writeNumber(time.get(ChronoField.MILLI_OF_SECOND));
71+
gen.writeNumber(time.get(ChronoField.MILLI_OF_SECOND));
7272
}
7373
}
74-
generator.writeString(time.getOffset().toString());
75-
generator.writeEndArray();
74+
gen.writeString(time.getOffset().toString());
75+
gen.writeEndArray();
7676
} else {
7777
String str = (_formatter == null) ? time.toString() : time.format(_formatter);
78-
generator.writeString(str);
78+
gen.writeString(str);
7979
}
8080
}
8181
}

0 commit comments

Comments
 (0)