Skip to content

Commit f974e6c

Browse files
committed
Second part of fix for #117
1 parent e03a06f commit f974e6c

File tree

5 files changed

+69
-20
lines changed

5 files changed

+69
-20
lines changed

src/main/java/com/fasterxml/jackson/datatype/joda/deser/DateMidnightDeserializer.java

+15-3
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
import com.fasterxml.jackson.core.JsonParser;
1010
import com.fasterxml.jackson.core.JsonToken;
1111
import com.fasterxml.jackson.core.JsonTokenId;
12+
import com.fasterxml.jackson.core.StreamReadCapability;
13+
import com.fasterxml.jackson.core.io.NumberInput;
1214
import com.fasterxml.jackson.databind.DeserializationContext;
1315
import com.fasterxml.jackson.datatype.joda.cfg.FormatConfig;
1416
import com.fasterxml.jackson.datatype.joda.cfg.JacksonJodaDateFormat;
@@ -45,7 +47,6 @@ public JodaDateDeserializerBase<?> withFormat(JacksonJodaDateFormat format) {
4547
public DateMidnight deserialize(JsonParser p, DeserializationContext ctxt)
4648
throws IOException
4749
{
48-
4950
// We'll accept either long (timestamp) or array:
5051
if (p.isExpectedStartArrayToken()) {
5152
p.nextToken(); // VALUE_NUMBER_INT
@@ -55,7 +56,7 @@ public DateMidnight deserialize(JsonParser p, DeserializationContext ctxt)
5556
p.nextToken(); // VALUE_NUMBER_INT
5657
int day = p.getIntValue();
5758
if (p.nextToken() != JsonToken.END_ARRAY) {
58-
throw ctxt.wrongTokenException(p, JsonToken.END_ARRAY,
59+
throw ctxt.wrongTokenException(p, handledType(), JsonToken.END_ARRAY,
5960
"after DateMidnight ints");
6061
}
6162
DateTimeZone tz = _format.isTimezoneExplicit() ? _format.getTimeZone() : DateTimeZone.forTimeZone(ctxt.getTimeZone());
@@ -70,6 +71,12 @@ public DateMidnight deserialize(JsonParser p, DeserializationContext ctxt)
7071
if (str.length() == 0) { // [JACKSON-360]
7172
return null;
7273
}
74+
// 14-Jul-2020: [datatype-joda#117] Should allow use of "Timestamp as String" for
75+
// some textual formats
76+
if (ctxt.isEnabled(StreamReadCapability.UNTYPED_SCALARS)
77+
&& _isValidTimestampString(str)) {
78+
return new DateMidnight(NumberInput.parseLong(str));
79+
}
7380
LocalDate local = _format.createParser(ctxt).parseLocalDate(str);
7481
if (local == null) {
7582
return null;
@@ -80,4 +87,9 @@ public DateMidnight deserialize(JsonParser p, DeserializationContext ctxt)
8087
throw ctxt.wrongTokenException(p, handledType(), JsonToken.START_ARRAY,
8188
"expected JSON Array, Number or String");
8289
}
83-
}
90+
91+
protected DateMidnight _fromTimestamp(DeserializationContext ctxt, long ts) {
92+
return new DateMidnight(ts);
93+
}
94+
95+
}

src/main/java/com/fasterxml/jackson/datatype/joda/deser/InstantDeserializer.java

+7-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import org.joda.time.Instant;
66

77
import com.fasterxml.jackson.core.*;
8-
8+
import com.fasterxml.jackson.core.io.NumberInput;
99
import com.fasterxml.jackson.databind.*;
1010
import com.fasterxml.jackson.datatype.joda.cfg.FormatConfig;
1111
import com.fasterxml.jackson.datatype.joda.cfg.JacksonJodaDateFormat;
@@ -44,6 +44,12 @@ public Instant deserialize(JsonParser p, DeserializationContext ctxt) throws IOE
4444
if (str.length() == 0) {
4545
return getNullValue(ctxt);
4646
}
47+
// 14-Jul-2020: [datatype-joda#117] Should allow use of "Timestamp as String" for
48+
// some textual formats
49+
if (ctxt.isEnabled(StreamReadCapability.UNTYPED_SCALARS)
50+
&& _isValidTimestampString(str)) {
51+
return new Instant(NumberInput.parseLong(str));
52+
}
4753
// 11-Sep-2018, tatu: `DateTimeDeserializer` allows timezone inclusion in brackets;
4854
// should that be checked here too?
4955
return Instant.parse(str, _format.createParser(ctxt));

src/main/java/com/fasterxml/jackson/datatype/joda/deser/LocalDateDeserializer.java

+20-8
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@
88
import com.fasterxml.jackson.core.JsonParser;
99
import com.fasterxml.jackson.core.JsonToken;
1010
import com.fasterxml.jackson.core.JsonTokenId;
11-
11+
import com.fasterxml.jackson.core.StreamReadCapability;
12+
import com.fasterxml.jackson.core.io.NumberInput;
1213
import com.fasterxml.jackson.databind.DeserializationContext;
1314
import com.fasterxml.jackson.datatype.joda.cfg.FormatConfig;
1415
import com.fasterxml.jackson.datatype.joda.cfg.JacksonJodaDateFormat;
@@ -37,13 +38,18 @@ public LocalDate deserialize(JsonParser p, DeserializationContext ctxt) throws I
3738
switch (p.currentTokenId()) {
3839
case JsonTokenId.ID_STRING:
3940
String str = p.getText().trim();
40-
return (str.length() == 0) ? null
41-
: _format.createParser(ctxt).parseLocalDate(str);
42-
case JsonTokenId.ID_NUMBER_INT:
43-
{
44-
DateTimeZone tz = _format.isTimezoneExplicit() ? _format.getTimeZone() : DateTimeZone.forTimeZone(ctxt.getTimeZone());
45-
return new LocalDate(p.getLongValue(), tz);
41+
if (str.length() == 0) {
42+
return getNullValue(ctxt);
43+
}
44+
// 14-Jul-2020: [datatype-joda#117] Should allow use of "Timestamp as String" for
45+
// some textual formats
46+
if (ctxt.isEnabled(StreamReadCapability.UNTYPED_SCALARS)
47+
&& _isValidTimestampString(str)) {
48+
return _fromTimestamp(ctxt, NumberInput.parseLong(str));
4649
}
50+
return _format.createParser(ctxt).parseLocalDate(str);
51+
case JsonTokenId.ID_NUMBER_INT:
52+
return _fromTimestamp(ctxt, p.getLongValue());
4753
case JsonTokenId.ID_START_ARRAY:
4854
// [yyyy,mm,dd] or ["yyyy","mm","dd"]
4955
int year = p.nextIntValue(-1); // fast speculative case
@@ -63,7 +69,13 @@ public LocalDate deserialize(JsonParser p, DeserializationContext ctxt) throws I
6369
}
6470
return new LocalDate(year, month, day);
6571
}
66-
return (LocalDate) ctxt.handleUnexpectedToken(handledType(), p.getCurrentToken(), p,
72+
return (LocalDate) ctxt.handleUnexpectedToken(handledType(), p.currentToken(), p,
6773
"expected String, Number or JSON Array");
6874
}
75+
76+
protected LocalDate _fromTimestamp(DeserializationContext ctxt, long ts) {
77+
DateTimeZone tz = _format.isTimezoneExplicit() ? _format.getTimeZone()
78+
: DateTimeZone.forTimeZone(ctxt.getTimeZone());
79+
return new LocalDate(ts, tz);
80+
}
6981
}

src/main/java/com/fasterxml/jackson/datatype/joda/deser/LocalDateTimeDeserializer.java

+19-8
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import org.joda.time.LocalDateTime;
77

88
import com.fasterxml.jackson.core.*;
9-
9+
import com.fasterxml.jackson.core.io.NumberInput;
1010
import com.fasterxml.jackson.databind.DeserializationContext;
1111
import com.fasterxml.jackson.datatype.joda.cfg.FormatConfig;
1212
import com.fasterxml.jackson.datatype.joda.cfg.JacksonJodaDateFormat;
@@ -37,14 +37,19 @@ public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt)
3737
case JsonTokenId.ID_STRING:
3838
{
3939
String str = p.getText().trim();
40-
return (str.length() == 0) ? null
41-
: _format.createParser(ctxt).parseLocalDateTime(str);
40+
if (str.length() == 0) {
41+
return getNullValue(ctxt);
42+
}
43+
// 14-Jul-2020: [datatype-joda#117] Should allow use of "Timestamp as String" for
44+
// some textual formats
45+
if (ctxt.isEnabled(StreamReadCapability.UNTYPED_SCALARS)
46+
&& _isValidTimestampString(str)) {
47+
return _fromTimestamp(ctxt, NumberInput.parseLong(str));
48+
}
49+
return _format.createParser(ctxt).parseLocalDateTime(str);
4250
}
4351
case JsonTokenId.ID_NUMBER_INT:
44-
{
45-
DateTimeZone tz = _format.isTimezoneExplicit() ? _format.getTimeZone() : DateTimeZone.forTimeZone(ctxt.getTimeZone());
46-
return new LocalDateTime(p.getLongValue(), tz);
47-
}
52+
return _fromTimestamp(ctxt, p.getLongValue());
4853
case JsonTokenId.ID_START_ARRAY:
4954
// [yyyy,mm,dd,hh,MM,ss,ms]
5055
JsonToken t = p.nextToken();
@@ -82,7 +87,13 @@ public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt)
8287
throw ctxt.wrongTokenException(p, handledType(), JsonToken.END_ARRAY, "after LocalDateTime ints");
8388
default:
8489
}
85-
return (LocalDateTime) ctxt.handleUnexpectedToken(handledType(), p.getCurrentToken(), p,
90+
return (LocalDateTime) ctxt.handleUnexpectedToken(handledType(), p.currentToken(), p,
8691
"expected String, Number or JSON Array");
8792
}
93+
94+
protected LocalDateTime _fromTimestamp(DeserializationContext ctxt, long ts) {
95+
DateTimeZone tz = _format.isTimezoneExplicit() ? _format.getTimeZone()
96+
: DateTimeZone.forTimeZone(ctxt.getTimeZone());
97+
return new LocalDateTime(ts, tz);
98+
}
8899
}

src/main/java/com/fasterxml/jackson/datatype/joda/deser/LocalTimeDeserializer.java

+8
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
import com.fasterxml.jackson.core.JsonParser;
88
import com.fasterxml.jackson.core.JsonToken;
99
import com.fasterxml.jackson.core.JsonTokenId;
10+
import com.fasterxml.jackson.core.StreamReadCapability;
11+
import com.fasterxml.jackson.core.io.NumberInput;
1012
import com.fasterxml.jackson.databind.DeserializationContext;
1113
import com.fasterxml.jackson.datatype.joda.cfg.FormatConfig;
1214
import com.fasterxml.jackson.datatype.joda.cfg.JacksonJodaDateFormat;
@@ -41,6 +43,12 @@ public LocalTime deserialize(JsonParser p, DeserializationContext ctxt)
4143
if (str.length() == 0) {
4244
return getNullValue(ctxt);
4345
}
46+
// 14-Jul-2020: [datatype-joda#117] Should allow use of "Timestamp as String" for
47+
// some textual formats
48+
if (ctxt.isEnabled(StreamReadCapability.UNTYPED_SCALARS)
49+
&& _isValidTimestampString(str)) {
50+
return new LocalTime(NumberInput.parseLong(str));
51+
}
4452
return _format.createParser(ctxt).parseLocalTime(str);
4553
default:
4654
}

0 commit comments

Comments
 (0)