Skip to content

Commit ff3734e

Browse files
committed
Merged #19; Add serializers and deserializers for MonthDay and YearMonth
Conflicts: src/main/java/com/fasterxml/jackson/datatype/joda/JodaModule.java src/test/java/com/fasterxml/jackson/datatype/joda/JodaDeserializationTest.java
2 parents d3ab9dd + 8ce41bb commit ff3734e

File tree

6 files changed

+161
-3
lines changed

6 files changed

+161
-3
lines changed

release-notes/VERSION

+2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
Project: jackson-datatype-joda
22
Version: 2.3.1 (xx-Dec-2013)
33

4+
#19: Add serializers and deserializers for MonthDay and YearMonth
5+
(contributed by ncjones@github)
46
#23: Package as a bundle (was accidentally not, just bare jar)
57
(suggested by Łukasz D)
68
#25: Add `KeyDeserializer` for `DateTime`

src/main/java/com/fasterxml/jackson/datatype/joda/JodaModule.java

+8-3
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22

33
import org.joda.time.*;
44

5+
import com.fasterxml.jackson.databind.JsonSerializer;
56
import com.fasterxml.jackson.databind.module.SimpleModule;
67
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
7-
88
import com.fasterxml.jackson.datatype.joda.deser.*;
99
import com.fasterxml.jackson.datatype.joda.ser.*;
1010

@@ -27,17 +27,22 @@ public JodaModule()
2727
addDeserializer(ReadableDateTime.class, DateTimeDeserializer.forType(ReadableDateTime.class));
2828
addDeserializer(ReadableInstant.class, DateTimeDeserializer.forType(ReadableInstant.class));
2929
addDeserializer(Interval.class, new IntervalDeserializer());
30+
addDeserializer(MonthDay.class, new MonthDayDeserializer());
31+
addDeserializer(YearMonth.class, new YearMonthDeserializer());
3032

3133
// then serializers:
34+
final JsonSerializer<Object> stringSer = ToStringSerializer.instance;
3235
addSerializer(DateMidnight.class, new DateMidnightSerializer());
3336
addSerializer(DateTime.class, new DateTimeSerializer());
3437
addSerializer(Duration.class, new DurationSerializer());
3538
addSerializer(Instant.class, new InstantSerializer());
3639
addSerializer(LocalDateTime.class, new LocalDateTimeSerializer());
3740
addSerializer(LocalDate.class, new LocalDateSerializer());
3841
addSerializer(LocalTime.class, new LocalTimeSerializer());
39-
addSerializer(Period.class, ToStringSerializer.instance);
42+
addSerializer(Period.class, stringSer);
4043
addSerializer(Interval.class, new IntervalSerializer());
44+
addSerializer(MonthDay.class, stringSer);
45+
addSerializer(YearMonth.class, stringSer);
4146

4247
// then key deserializers - only one included for DateTime here.
4348
addKeyDeserializer(DateTime.class, new DateTimeKeyDeserializer());
@@ -46,7 +51,7 @@ public JodaModule()
4651
@Override
4752
public int hashCode()
4853
{
49-
return JodaModule.class.hashCode();
54+
return getClass().hashCode();
5055
}
5156

5257
@Override
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package com.fasterxml.jackson.datatype.joda.deser;
2+
3+
import java.io.IOException;
4+
5+
import org.joda.time.MonthDay;
6+
7+
import com.fasterxml.jackson.core.JsonParser;
8+
import com.fasterxml.jackson.core.JsonToken;
9+
import com.fasterxml.jackson.databind.DeserializationContext;
10+
11+
/**
12+
* A Jackson deserializer for Joda MonthDay objects.
13+
* <p>
14+
* Expects a string value compatible with MonthDay's parse operation.
15+
*/
16+
public class MonthDayDeserializer extends JodaDeserializerBase<MonthDay>
17+
{
18+
19+
private static final long serialVersionUID = -2360834248497553111L;
20+
21+
public MonthDayDeserializer()
22+
{
23+
super(MonthDay.class);
24+
}
25+
26+
@Override
27+
public MonthDay deserialize(final JsonParser jp, final DeserializationContext ctxt) throws IOException
28+
{
29+
JsonToken t = jp.getCurrentToken();
30+
if (t == JsonToken.VALUE_STRING)
31+
{
32+
String str = jp.getText().trim();
33+
if (str.isEmpty())
34+
{
35+
return null;
36+
}
37+
return MonthDay.parse(str);
38+
}
39+
throw ctxt.wrongTokenException(jp, JsonToken.VALUE_STRING, "expected JSON String");
40+
}
41+
42+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package com.fasterxml.jackson.datatype.joda.deser;
2+
3+
import java.io.IOException;
4+
5+
import org.joda.time.YearMonth;
6+
7+
import com.fasterxml.jackson.core.JsonParser;
8+
import com.fasterxml.jackson.core.JsonToken;
9+
import com.fasterxml.jackson.databind.DeserializationContext;
10+
11+
/**
12+
* A Jackson deserializer for Joda YearMonth objects.
13+
* <p>
14+
* Expects a string value compatible with YearMonth's parse operation.
15+
*/
16+
public class YearMonthDeserializer extends JodaDeserializerBase<YearMonth>
17+
{
18+
19+
private static final long serialVersionUID = -3830851040664795250L;
20+
21+
public YearMonthDeserializer()
22+
{
23+
super(YearMonth.class);
24+
}
25+
26+
@Override
27+
public YearMonth deserialize(final JsonParser jp, final DeserializationContext ctxt) throws IOException
28+
{
29+
JsonToken t = jp.getCurrentToken();
30+
if (t == JsonToken.VALUE_STRING)
31+
{
32+
String str = jp.getText().trim();
33+
if (str.isEmpty())
34+
{
35+
return null;
36+
}
37+
return YearMonth.parse(str);
38+
}
39+
throw ctxt.wrongTokenException(jp, JsonToken.VALUE_STRING, "expected JSON String");
40+
}
41+
42+
}

src/test/java/com/fasterxml/jackson/datatype/joda/JodaDeserializationTest.java

+50
Original file line numberDiff line numberDiff line change
@@ -397,4 +397,54 @@ public void testDateTimeKeyDeserialize() throws IOException {
397397
assertTrue(map.containsKey(DateTime.parse("1970-01-01T00:00:00.000Z")));
398398
}
399399

400+
public void testDeserMonthDay() throws Exception
401+
{
402+
String monthDayString = new MonthDay(7, 23).toString();
403+
MonthDay monthDay = MAPPER.readValue(quote(monthDayString), MonthDay.class);
404+
assertEquals(new MonthDay(7, 23), monthDay);
405+
}
406+
407+
public void testDeserMonthDayFromEmptyString() throws Exception
408+
{
409+
MonthDay monthDay = MAPPER.readValue(quote(""), MonthDay.class);
410+
assertNull(monthDay);
411+
}
412+
413+
public void testDeserMonthDayFailsForUnexpectedType() throws IOException
414+
{
415+
try
416+
{
417+
MAPPER.readValue("{\"month\":8}", MonthDay.class);
418+
fail();
419+
} catch (JsonMappingException e)
420+
{
421+
assertTrue(e.getMessage().contains("expected JSON String"));
422+
}
423+
}
424+
425+
public void testDeserYearMonth() throws Exception
426+
{
427+
String yearMonthString = new YearMonth(2013, 8).toString();
428+
YearMonth yearMonth = MAPPER.readValue(quote(yearMonthString), YearMonth.class);
429+
assertEquals(new YearMonth(2013, 8), yearMonth);
430+
}
431+
432+
public void testDeserYearMonthFromEmptyString() throws Exception
433+
{
434+
YearMonth yearMonth = MAPPER.readValue(quote(""), YearMonth.class);
435+
assertNull(yearMonth);
436+
}
437+
438+
public void testDeserYearMonthFailsForUnexpectedType() throws IOException
439+
{
440+
try
441+
{
442+
MAPPER.readValue("{\"year\":2013}", YearMonth.class);
443+
fail();
444+
} catch (JsonMappingException e)
445+
{
446+
assertTrue(e.getMessage().contains("expected JSON String"));
447+
}
448+
}
449+
400450
}

src/test/java/com/fasterxml/jackson/datatype/joda/JodaSerializationTest.java

+17
Original file line numberDiff line numberDiff line change
@@ -239,4 +239,21 @@ public void testInstantSer() throws IOException {
239239
m.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
240240
assertEquals(quote("1970-01-01T00:00:00.000Z"), m.writeValueAsString(instant));
241241
}
242+
243+
public void testMonthDaySer() throws Exception
244+
{
245+
MonthDay monthDay = new MonthDay(7, 23);
246+
ObjectMapper mapper = jodaMapper();
247+
String json = mapper.writeValueAsString(monthDay);
248+
assertEquals(quote("--07-23"), json);
249+
}
250+
251+
public void testYearMonthSer() throws Exception
252+
{
253+
YearMonth yearMonth = new YearMonth(2013, 8);
254+
ObjectMapper mapper = jodaMapper();
255+
String json = mapper.writeValueAsString(yearMonth);
256+
assertEquals(quote("2013-08"), json);
257+
}
258+
242259
}

0 commit comments

Comments
 (0)