Skip to content

Commit a374dbe

Browse files
committed
Completed initial #64 implementation
1 parent 5d56e70 commit a374dbe

File tree

8 files changed

+110
-95
lines changed

8 files changed

+110
-95
lines changed

release-notes/VERSION

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ Project: jackson-datatype-joda
1010
(contributed by Michal Z)
1111
#62: Allow use of numbers-as-Strings for LocalDate (in array)
1212
(contributed by Michal Z)
13+
#64: Support `@JsonFormat(pattern=...)` for deserialization
1314

1415
2.5.4 (not yet released)
1516

src/main/java/com/fasterxml/jackson/datatype/joda/cfg/FormatConfig.java

Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -19,48 +19,53 @@ public class FormatConfig
1919
{
2020
// Actual Joda formatters
2121

22+
/*
2223
public final static DateTimeFormatter DEFAULT_JODA_DATEONLY_FORMAT
23-
= ISODateTimeFormat.date().withZoneUTC();
24+
= ;
2425
2526
public final static DateTimeFormatter DEFAULT_JODA_TIMEONLY_FORMAT
26-
= ISODateTimeFormat.time().withZoneUTC();
27+
= ;
2728
2829
public final static DateTimeFormatter DEFAULT_JODA_DATETIME_FORMAT
29-
= ISODateTimeFormat.dateTime().withZoneUTC();
30+
= ;
3031
3132
public final static PeriodFormatter DEFAULT_JODA_PERIOD_FORMAT
32-
= ISOPeriodFormat.standard();
33+
=
34+
*/
3335

3436
// Matching wrappers for more information needed with formatter
3537

3638
public final static JacksonJodaDateFormat DEFAULT_DATEONLY_FORMAT
37-
= new JacksonJodaDateFormat(FormatConfig.DEFAULT_JODA_DATEONLY_FORMAT);
39+
= new JacksonJodaDateFormat(ISODateTimeFormat.date().withZoneUTC());
3840

3941
public final static JacksonJodaDateFormat DEFAULT_TIMEONLY_FORMAT
40-
= new JacksonJodaDateFormat(FormatConfig.DEFAULT_JODA_TIMEONLY_FORMAT);
42+
= new JacksonJodaDateFormat(ISODateTimeFormat.time().withZoneUTC());
4143

4244
public final static JacksonJodaDateFormat DEFAULT_DATETIME_FORMAT
43-
= new JacksonJodaDateFormat(FormatConfig.DEFAULT_JODA_DATETIME_FORMAT);
45+
= new JacksonJodaDateFormat(ISODateTimeFormat.dateTime().withZoneUTC());
4446

47+
public final static JacksonJodaPeriodFormat DEFAULT_PERIOD_FORMAT
48+
= new JacksonJodaPeriodFormat(ISOPeriodFormat.standard());
49+
4550
// should these differ from ones above? Presumably should use local timezone or... ?
4651

47-
public final static JacksonJodaDateFormat DEFAULT_LOCAL_DATETIME_FORMAT
48-
= new JacksonJodaDateFormat(FormatConfig.DEFAULT_JODA_DATETIME_FORMAT
49-
.withZone(DateTimeZone.getDefault())
50-
);
51-
5252
public final static JacksonJodaDateFormat DEFAULT_LOCAL_DATEONLY_FORMAT
53-
= new JacksonJodaDateFormat(FormatConfig.DEFAULT_JODA_DATEONLY_FORMAT
54-
.withZone(DateTimeZone.getDefault())
55-
);
56-
// final static DateTimeFormatter parser = ISODateTimeFormat.localDateOptionalTimeParser();
53+
= new JacksonJodaDateFormat(ISODateTimeFormat.date()
54+
.withZone(DateTimeZone.getDefault()));
5755

58-
public final static JacksonJodaDateFormat DEFAULT_LOCAL_TIMEONLY_FORMAT
59-
= new JacksonJodaDateFormat(FormatConfig.DEFAULT_JODA_TIMEONLY_FORMAT
60-
.withZone(DateTimeZone.getDefault())
61-
);
56+
public final static JacksonJodaDateFormat DEFAULT_LOCAL_TIMEONLY_PRINTER
57+
= new JacksonJodaDateFormat(ISODateTimeFormat.time()
58+
.withZone(DateTimeZone.getDefault()));
6259

60+
public final static JacksonJodaDateFormat DEFAULT_LOCAL_TIMEONLY_PARSER
61+
= new JacksonJodaDateFormat(ISODateTimeFormat.localTimeParser()
62+
.withZone(DateTimeZone.getDefault()));
63+
64+
public final static JacksonJodaDateFormat DEFAULT_LOCAL_DATETIME_PRINTER
65+
= new JacksonJodaDateFormat(ISODateTimeFormat.dateTime()
66+
.withZone(DateTimeZone.getDefault()));
6367

64-
public final static JacksonJodaPeriodFormat DEFAULT_PERIOD_FORMAT
65-
= new JacksonJodaPeriodFormat(DEFAULT_JODA_PERIOD_FORMAT);
68+
public final static JacksonJodaDateFormat DEFAULT_LOCAL_DATETIME_PARSER
69+
= new JacksonJodaDateFormat(ISODateTimeFormat.localDateOptionalTimeParser()
70+
.withZone(DateTimeZone.getDefault()));
6671
}

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

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import com.fasterxml.jackson.datatype.joda.cfg.JacksonJodaDateFormat;
1212

1313
public class LocalDateDeserializer
14-
extends JodaDateDeserializerBase<LocalDate>
14+
extends JodaDateDeserializerBase<LocalDate>
1515
{
1616
private static final long serialVersionUID = 1L;
1717

@@ -33,10 +33,8 @@ public LocalDate deserialize(JsonParser p, DeserializationContext ctxt) throws I
3333
{
3434
if (p.getCurrentToken() == JsonToken.VALUE_STRING) {
3535
String str = p.getText().trim();
36-
if (str.length() == 0) {
37-
return null;
38-
}
39-
return _format.createParser(ctxt).parseLocalDate(str);
36+
return (str.length() == 0) ? null
37+
: _format.createParser(ctxt).parseLocalDate(str);
4038
}
4139
if (p.getCurrentToken() == JsonToken.VALUE_NUMBER_INT) {
4240
return new LocalDate(p.getLongValue());

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

Lines changed: 43 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -3,67 +3,72 @@
33
import java.io.IOException;
44

55
import org.joda.time.LocalDateTime;
6-
import org.joda.time.format.DateTimeFormatter;
7-
import org.joda.time.format.ISODateTimeFormat;
86

97
import com.fasterxml.jackson.core.JsonParser;
10-
import com.fasterxml.jackson.core.JsonProcessingException;
118
import com.fasterxml.jackson.core.JsonToken;
129
import com.fasterxml.jackson.databind.DeserializationContext;
13-
10+
import com.fasterxml.jackson.datatype.joda.cfg.FormatConfig;
11+
import com.fasterxml.jackson.datatype.joda.cfg.JacksonJodaDateFormat;
1412

1513
public class LocalDateTimeDeserializer
16-
extends JodaDeserializerBase<LocalDateTime>
14+
extends JodaDateDeserializerBase<LocalDateTime>
1715
{
1816
private static final long serialVersionUID = 1L;
1917

20-
final static DateTimeFormatter parser = ISODateTimeFormat.localDateOptionalTimeParser();
18+
public LocalDateTimeDeserializer() {
19+
this(FormatConfig.DEFAULT_LOCAL_DATETIME_PARSER);
20+
}
21+
22+
public LocalDateTimeDeserializer(JacksonJodaDateFormat format) {
23+
super(LocalDateTime.class, format);
24+
}
2125

22-
public LocalDateTimeDeserializer() { super(LocalDateTime.class); }
26+
@Override
27+
public JodaDateDeserializerBase<?> withFormat(JacksonJodaDateFormat format) {
28+
return new LocalDateTimeDeserializer(format);
29+
}
2330

2431
@Override
25-
public LocalDateTime deserialize(JsonParser jp, DeserializationContext ctxt)
26-
throws IOException, JsonProcessingException
32+
public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt)
33+
throws IOException
2734
{
28-
switch (jp.getCurrentToken()) {
35+
switch (p.getCurrentToken()) {
36+
case VALUE_STRING:
37+
String str = p.getText().trim();
38+
return (str.length() == 0) ? null
39+
: _format.createParser(ctxt).parseLocalDateTime(str);
40+
case VALUE_NUMBER_INT:
41+
return new LocalDateTime(p.getLongValue());
2942
case START_ARRAY:
3043
// [yyyy,mm,dd,hh,MM,ss,ms]
31-
if (jp.isExpectedStartArrayToken()) {
32-
jp.nextToken(); // VALUE_NUMBER_INT
33-
int year = jp.getIntValue();
34-
jp.nextToken(); // VALUE_NUMBER_INT
35-
int month = jp.getIntValue();
36-
jp.nextToken(); // VALUE_NUMBER_INT
37-
int day = jp.getIntValue();
38-
jp.nextToken(); // VALUE_NUMBER_INT
39-
int hour = jp.getIntValue();
40-
jp.nextToken(); // VALUE_NUMBER_INT
41-
int minute = jp.getIntValue();
42-
jp.nextToken(); // VALUE_NUMBER_INT
43-
int second = jp.getIntValue();
44-
jp.nextToken(); // VALUE_NUMBER_INT | END_ARRAY
44+
if (p.isExpectedStartArrayToken()) {
45+
p.nextToken(); // VALUE_NUMBER_INT
46+
int year = p.getIntValue();
47+
p.nextToken(); // VALUE_NUMBER_INT
48+
int month = p.getIntValue();
49+
p.nextToken(); // VALUE_NUMBER_INT
50+
int day = p.getIntValue();
51+
p.nextToken(); // VALUE_NUMBER_INT
52+
int hour = p.getIntValue();
53+
p.nextToken(); // VALUE_NUMBER_INT
54+
int minute = p.getIntValue();
55+
p.nextToken(); // VALUE_NUMBER_INT
56+
int second = p.getIntValue();
57+
p.nextToken(); // VALUE_NUMBER_INT | END_ARRAY
4558
// let's leave milliseconds optional?
4659
int millisecond = 0;
47-
if (jp.getCurrentToken() != JsonToken.END_ARRAY) { // VALUE_NUMBER_INT
48-
millisecond = jp.getIntValue();
49-
jp.nextToken(); // END_ARRAY?
60+
if (p.getCurrentToken() != JsonToken.END_ARRAY) { // VALUE_NUMBER_INT
61+
millisecond = p.getIntValue();
62+
p.nextToken(); // END_ARRAY?
5063
}
51-
if (jp.getCurrentToken() != JsonToken.END_ARRAY) {
52-
throw ctxt.wrongTokenException(jp, JsonToken.END_ARRAY, "after LocalDateTime ints");
64+
if (p.getCurrentToken() != JsonToken.END_ARRAY) {
65+
throw ctxt.wrongTokenException(p, JsonToken.END_ARRAY, "after LocalDateTime ints");
5366
}
5467
return new LocalDateTime(year, month, day, hour, minute, second, millisecond);
5568
}
5669
break;
57-
case VALUE_NUMBER_INT:
58-
return new LocalDateTime(jp.getLongValue());
59-
case VALUE_STRING:
60-
String str = jp.getText().trim();
61-
if (str.length() == 0) { // [JACKSON-360]
62-
return null;
63-
}
64-
return parser.parseLocalDateTime(str);
6570
default:
6671
}
67-
throw ctxt.wrongTokenException(jp, JsonToken.START_ARRAY, "expected JSON Array, Number or String");
72+
throw ctxt.wrongTokenException(p, JsonToken.START_ARRAY, "expected JSON Array, Number or String");
6873
}
6974
}

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

Lines changed: 34 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -3,57 +3,64 @@
33
import java.io.IOException;
44

55
import org.joda.time.LocalTime;
6-
import org.joda.time.format.DateTimeFormatter;
7-
import org.joda.time.format.ISODateTimeFormat;
86

97
import com.fasterxml.jackson.core.*;
108
import com.fasterxml.jackson.databind.DeserializationContext;
9+
import com.fasterxml.jackson.datatype.joda.cfg.FormatConfig;
10+
import com.fasterxml.jackson.datatype.joda.cfg.JacksonJodaDateFormat;
1111

1212
public class LocalTimeDeserializer
13-
extends JodaDeserializerBase<LocalTime>
13+
extends JodaDateDeserializerBase<LocalTime>
1414
{
1515
private static final long serialVersionUID = 1L;
1616

17-
final static DateTimeFormatter parser = ISODateTimeFormat.localTimeParser();
17+
public LocalTimeDeserializer() {
18+
this(FormatConfig.DEFAULT_LOCAL_TIMEONLY_PARSER);
19+
}
20+
21+
public LocalTimeDeserializer(JacksonJodaDateFormat format) {
22+
super(LocalTime.class, format);
23+
}
1824

19-
public LocalTimeDeserializer() { super(LocalTime.class); }
25+
@Override
26+
public JodaDateDeserializerBase<?> withFormat(JacksonJodaDateFormat format) {
27+
return new LocalTimeDeserializer(format);
28+
}
2029

2130
@Override
22-
public LocalTime deserialize(JsonParser jp, DeserializationContext ctxt)
31+
public LocalTime deserialize(JsonParser p, DeserializationContext ctxt)
2332
throws IOException
2433
{
25-
switch (jp.getCurrentToken()) {
34+
switch (p.getCurrentToken()) {
2635
case START_ARRAY:
2736
// [HH,MM,ss,ms?]
28-
if (jp.isExpectedStartArrayToken()) {
29-
jp.nextToken(); // VALUE_NUMBER_INT
30-
int hour = jp.getIntValue();
31-
jp.nextToken(); // VALUE_NUMBER_INT
32-
int minute = jp.getIntValue();
33-
jp.nextToken(); // VALUE_NUMBER_INT
34-
int second = jp.getIntValue();
35-
jp.nextToken(); // VALUE_NUMBER_INT | END_ARRAY
37+
if (p.isExpectedStartArrayToken()) {
38+
p.nextToken(); // VALUE_NUMBER_INT
39+
int hour = p.getIntValue();
40+
p.nextToken(); // VALUE_NUMBER_INT
41+
int minute = p.getIntValue();
42+
p.nextToken(); // VALUE_NUMBER_INT
43+
int second = p.getIntValue();
44+
p.nextToken(); // VALUE_NUMBER_INT | END_ARRAY
3645
int millis = 0;
37-
if (jp.getCurrentToken() != JsonToken.END_ARRAY) {
38-
millis = jp.getIntValue();
39-
jp.nextToken(); // END_ARRAY?
46+
if (p.getCurrentToken() != JsonToken.END_ARRAY) {
47+
millis = p.getIntValue();
48+
p.nextToken(); // END_ARRAY?
4049
}
41-
if (jp.getCurrentToken() != JsonToken.END_ARRAY) {
42-
throw ctxt.wrongTokenException(jp, JsonToken.END_ARRAY, "after LocalTime ints");
50+
if (p.getCurrentToken() != JsonToken.END_ARRAY) {
51+
throw ctxt.wrongTokenException(p, JsonToken.END_ARRAY, "after LocalTime ints");
4352
}
4453
return new LocalTime(hour, minute, second, millis);
4554
}
4655
break;
4756
case VALUE_NUMBER_INT:
48-
return new LocalTime(jp.getLongValue());
57+
return new LocalTime(p.getLongValue());
4958
case VALUE_STRING:
50-
String str = jp.getText().trim();
51-
if (str.length() == 0) { // [JACKSON-360]
52-
return null;
53-
}
54-
return parser.parseLocalTime(str);
59+
String str = p.getText().trim();
60+
return (str.length() == 0) ? null
61+
: _format.createParser(ctxt).parseLocalTime(str);
5562
default:
5663
}
57-
throw ctxt.wrongTokenException(jp, JsonToken.START_ARRAY, "expected JSON Array, String or Number");
64+
throw ctxt.wrongTokenException(p, JsonToken.START_ARRAY, "expected JSON Array, String or Number");
5865
}
5966
}

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,5 +37,4 @@ public MonthDay deserialize(final JsonParser jp, final DeserializationContext ct
3737
}
3838
throw ctxt.wrongTokenException(jp, JsonToken.VALUE_STRING, "expected JSON String");
3939
}
40-
4140
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public final class LocalDateTimeSerializer
1515
{
1616
private static final long serialVersionUID = 1L;
1717

18-
public LocalDateTimeSerializer() { this(FormatConfig.DEFAULT_LOCAL_DATETIME_FORMAT); }
18+
public LocalDateTimeSerializer() { this(FormatConfig.DEFAULT_LOCAL_DATETIME_PRINTER); }
1919
public LocalDateTimeSerializer(JacksonJodaDateFormat format) {
2020
super(LocalDateTime.class, format, true,
2121
SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public final class LocalTimeSerializer
1616
{
1717
private static final long serialVersionUID = 1L;
1818

19-
public LocalTimeSerializer() { this(FormatConfig.DEFAULT_LOCAL_TIMEONLY_FORMAT); }
19+
public LocalTimeSerializer() { this(FormatConfig.DEFAULT_LOCAL_TIMEONLY_PRINTER); }
2020
public LocalTimeSerializer(JacksonJodaDateFormat format) {
2121
super(LocalTime.class, format, true,
2222
SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

0 commit comments

Comments
 (0)