Skip to content

Commit 3f564fa

Browse files
author
Boleslav Bobcik
committed
Fix FasterXML#364 [MR]: decode integer tokens representing month number directly
1 parent c378ccf commit 3f564fa

File tree

1 file changed

+18
-12
lines changed

1 file changed

+18
-12
lines changed

datetime/src/main/java/com/fasterxml/jackson/datatype/jsr310/deser/OneBasedMonthDeserializer.java

+18-12
Original file line numberDiff line numberDiff line change
@@ -23,22 +23,21 @@ public OneBasedMonthDeserializer(JsonDeserializer<?> defaultDeserializer) {
2323
@Override
2424
public Object deserialize(JsonParser parser, DeserializationContext context) throws IOException {
2525
JsonToken token = parser.currentToken();
26-
if (_isPossibleNumericValue(token)) {
27-
String monthSpec = parser.getText();
28-
int oneBasedMonthNumber = _decodeNumber(monthSpec);
29-
if (1 <= oneBasedMonthNumber && oneBasedMonthNumber <= 12) {
30-
return Month.of(oneBasedMonthNumber);
31-
} else if (oneBasedMonthNumber >= 0) {
32-
throw new InvalidFormatException(parser, "Month number " + oneBasedMonthNumber + " not allowed for 1-based Month.", oneBasedMonthNumber, Integer.class);
33-
}
26+
switch (token) {
27+
case VALUE_NUMBER_INT:
28+
return _decodeMonth(parser.getIntValue(), parser);
29+
case VALUE_STRING:
30+
String monthSpec = parser.getText();
31+
int oneBasedMonthNumber = _decodeNumber(monthSpec);
32+
if (oneBasedMonthNumber >= 0) {
33+
return _decodeMonth(oneBasedMonthNumber, parser);
34+
}
35+
// Otherwise fall through to default handling
36+
break;
3437
}
3538
return getDelegatee().deserialize(parser, context);
3639
}
3740

38-
private boolean _isPossibleNumericValue(JsonToken token) {
39-
return token == JsonToken.VALUE_NUMBER_INT || token == JsonToken.VALUE_STRING;
40-
}
41-
4241
/**
4342
* @return Numeric value of input text that represents a 1-digit or 2-digit number.
4443
* Negative value in other cases (empty string, not a number, 3 or more digits).
@@ -63,6 +62,13 @@ private int _decodeNumber(String text) {
6362
return numValue;
6463
}
6564

65+
private Month _decodeMonth(int oneBasedMonthNumber, JsonParser parser) throws InvalidFormatException {
66+
if (Month.JANUARY.getValue() <= oneBasedMonthNumber && oneBasedMonthNumber <= Month.DECEMBER.getValue()) {
67+
return Month.of(oneBasedMonthNumber);
68+
}
69+
throw new InvalidFormatException(parser, "Month number " + oneBasedMonthNumber + " not allowed for 1-based Month.", oneBasedMonthNumber, Integer.class);
70+
}
71+
6672
@Override
6773
protected JsonDeserializer<?> newDelegatingInstance(JsonDeserializer<?> newDelegatee) {
6874
return new OneBasedMonthDeserializer(newDelegatee);

0 commit comments

Comments
 (0)