Skip to content

Commit e03a06f

Browse files
committed
Partial fix for #117
1 parent d5c1cd6 commit e03a06f

8 files changed

+38
-15
lines changed

release-notes/VERSION-2.x

+1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ Project: jackson-datatype-joda
88

99
#116: Improve schema support for DateTimeZone type
1010
(contributed by Joost v-d-W)
11+
#117: Timestamp deserialization not working for CSV, Properties or XML
1112

1213
2.11.1 (25-Jun-2020)
1314

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

+16-3
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99

1010
import com.fasterxml.jackson.core.JsonParser;
1111
import com.fasterxml.jackson.core.JsonTokenId;
12-
12+
import com.fasterxml.jackson.core.StreamReadCapability;
13+
import com.fasterxml.jackson.core.io.NumberInput;
1314
import com.fasterxml.jackson.databind.DeserializationContext;
1415
import com.fasterxml.jackson.databind.JsonDeserializer;
1516
import com.fasterxml.jackson.datatype.joda.cfg.FormatConfig;
@@ -48,8 +49,7 @@ public ReadableInstant deserialize(JsonParser p, DeserializationContext ctxt)
4849
DateTimeZone tz;
4950
switch (p.currentTokenId()) {
5051
case JsonTokenId.ID_NUMBER_INT:
51-
tz = _format.isTimezoneExplicit() ? _format.getTimeZone() : DateTimeZone.forTimeZone(ctxt.getTimeZone());
52-
return new DateTime(p.getLongValue(), tz);
52+
return _fromTimestamp(ctxt, p.getLongValue());
5353
case JsonTokenId.ID_STRING:
5454
String str = p.getText().trim();
5555
if (str.length() == 0) {
@@ -92,10 +92,23 @@ public ReadableInstant deserialize(JsonParser p, DeserializationContext ctxt)
9292
}
9393
return result;
9494
}
95+
// 14-Jul-2020: [datatype-joda#117] Should allow use of "Timestamp as String" for
96+
// some textual formats
97+
if (ctxt.isEnabled(StreamReadCapability.UNTYPED_SCALARS)
98+
&& _isValidTimestampString(str)) {
99+
return _fromTimestamp(ctxt, NumberInput.parseLong(str));
100+
}
101+
95102
// Not sure if it should use timezone or not...
96103
// 15-Sep-2015, tatu: impl of 'createParser()' SHOULD handle all timezone/locale setup
97104
return _format.createParser(ctxt).parseDateTime(str);
98105
}
99106
return _handleNotNumberOrString(p, ctxt);
100107
}
108+
109+
protected DateTime _fromTimestamp(DeserializationContext ctxt, long ts) {
110+
DateTimeZone tz = _format.isTimezoneExplicit() ? _format.getTimeZone()
111+
: DateTimeZone.forTimeZone(ctxt.getTimeZone());
112+
return new DateTime(ts, tz);
113+
}
101114
}

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public Instant deserialize(JsonParser p, DeserializationContext ctxt) throws IOE
4242
case JsonTokenId.ID_STRING:
4343
String str = p.getText().trim();
4444
if (str.length() == 0) {
45-
return null;
45+
return getNullValue(ctxt);
4646
}
4747
// 11-Sep-2018, tatu: `DateTimeDeserializer` allows timezone inclusion in brackets;
4848
// should that be checked here too?

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

+3-4
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,13 @@ public Interval deserialize(JsonParser p, DeserializationContext ctxt)
3636
{
3737
if (!p.hasToken(JsonToken.VALUE_STRING)) {
3838
return (Interval) ctxt.handleUnexpectedToken(handledType(),
39-
p.getCurrentToken(), p, "expected JSON String");
39+
p.currentToken(), p, "expected JSON String");
4040
}
4141

4242
String v = p.getText().trim();
4343

44-
/* 17-Nov-2014, tatu: Actually let's start with slash, instead of hyphen, because
45-
* that is the separator for standard functionality...
46-
*/
44+
// 17-Nov-2014, tatu: Actually let's start with slash, instead of hyphen, because
45+
// that is the separator for standard functionality...
4746
int index = v.indexOf('/', 1);
4847
boolean hasSlash = (index > 0);
4948
if (!hasSlash) {

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

+9
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.fasterxml.jackson.datatype.joda.deser;
22

33
import com.fasterxml.jackson.annotation.JsonFormat;
4+
import com.fasterxml.jackson.core.io.NumberInput;
45
import com.fasterxml.jackson.databind.*;
56
import com.fasterxml.jackson.databind.deser.ContextualDeserializer;
67
import com.fasterxml.jackson.datatype.joda.cfg.JacksonJodaDateFormat;
@@ -60,4 +61,12 @@ public JsonDeserializer<?> createContextual(DeserializationContext ctxt,
6061
}
6162
return this;
6263
}
64+
65+
// @since 2.12
66+
protected boolean _isValidTimestampString(String str) {
67+
// 14-Jul-2020, tatu: Need to support "numbers as Strings" for data formats
68+
// that only have String values for scalars (CSV, Properties, XML)
69+
// NOTE: we do allow negative values, but has to fit in 64-bits:
70+
return _isIntNumber(str) && NumberInput.inLongRange(str, (str.charAt(0) == '-'));
71+
}
6372
}

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

+4-2
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,10 @@ public LocalTime deserialize(JsonParser p, DeserializationContext ctxt)
3838
return new LocalTime(p.getLongValue());
3939
case JsonTokenId.ID_STRING:
4040
String str = p.getText().trim();
41-
return (str.length() == 0) ? null
42-
: _format.createParser(ctxt).parseLocalTime(str);
41+
if (str.length() == 0) {
42+
return getNullValue(ctxt);
43+
}
44+
return _format.createParser(ctxt).parseLocalTime(str);
4345
default:
4446
}
4547
// [HH,MM,ss,ms?]

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public MonthDay deserialize(final JsonParser p, final DeserializationContext ctx
4242
}
4343
return MonthDay.parse(str, _format.createParser(ctxt));
4444
}
45-
return (MonthDay) ctxt.handleUnexpectedToken(handledType(), p.getCurrentToken(), p,
45+
return (MonthDay) ctxt.handleUnexpectedToken(handledType(), p.currentToken(), p,
4646
"expected JSON String");
4747
}
4848
}

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

+3-4
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,14 @@ public JodaDateDeserializerBase<?> withFormat(JacksonJodaDateFormat format) {
3535
@Override
3636
public YearMonth deserialize(final JsonParser p, final DeserializationContext ctxt) throws IOException
3737
{
38-
JsonToken t = p.getCurrentToken();
39-
if (t == JsonToken.VALUE_STRING) {
38+
if (p.hasToken(JsonToken.VALUE_STRING)) {
4039
String str = p.getText().trim();
4140
if (str.isEmpty()) {
42-
return null;
41+
return getNullValue(ctxt);
4342
}
4443
return YearMonth.parse(str, _format.createParser(ctxt));
4544
}
46-
return (YearMonth) ctxt.handleUnexpectedToken(handledType(), p.getCurrentToken(), p,
45+
return (YearMonth) ctxt.handleUnexpectedToken(handledType(), p.currentToken(), p,
4746
"expected JSON String");
4847
}
4948
}

0 commit comments

Comments
 (0)