@@ -55,8 +55,12 @@ public class DurationDeserializer extends JSR310DeserializerBase<Duration>
55
55
56
56
/**
57
57
* Since 2.12
58
+ * When set, values will be deserialized using the specified unit. Using this parser will tipically
59
+ * override the value specified in {@link DeserializationFeature.READ_DATE_TIMESTAMPS_AS_NANOSECONDS} as it is
60
+ * considered that the unit set in {@link JsonFormat#pattern()} has precedence since is more specific.
61
+ * @see [jackson-modules-java8#184] for more info
58
62
*/
59
- private DurationPattern _durationPattern ;
63
+ private DurationUnitParser _durationUnitParser ;
60
64
61
65
private DurationDeserializer ()
62
66
{
@@ -70,9 +74,9 @@ protected DurationDeserializer(DurationDeserializer base, Boolean leniency) {
70
74
super (base , leniency );
71
75
}
72
76
73
- protected DurationDeserializer (DurationDeserializer base , DurationPattern durationPattern ) {
77
+ protected DurationDeserializer (DurationDeserializer base , DurationUnitParser durationUnitParser ) {
74
78
super (base , base ._isLenient );
75
- _durationPattern = durationPattern ;
79
+ _durationUnitParser = durationUnitParser ;
76
80
}
77
81
78
82
@ Override
@@ -94,15 +98,15 @@ public JsonDeserializer<?> createContextual(DeserializationContext ctxt,
94
98
}
95
99
}
96
100
if (format .hasPattern ()) {
97
- deser = DurationPattern .from (format .getPattern ())
101
+ deser = DurationUnitParser .from (format .getPattern ())
98
102
.map (deser ::withPattern )
99
103
.orElse (deser );
100
104
}
101
105
}
102
106
return deser ;
103
107
}
104
108
105
- private DurationDeserializer withPattern (DurationPattern pattern ) {
109
+ private DurationDeserializer withPattern (DurationUnitParser pattern ) {
106
110
return new DurationDeserializer (this , pattern );
107
111
}
108
112
@@ -113,14 +117,14 @@ public Duration deserialize(JsonParser parser, DeserializationContext context) t
113
117
{
114
118
case JsonTokenId .ID_NUMBER_FLOAT :
115
119
BigDecimal decValue = parser .getDecimalValue ();
116
- if (_durationPattern != null ) {
117
- return _durationPattern .parse (decValue .longValue ());
120
+ if (_durationUnitParser != null ) {
121
+ return _durationUnitParser .parse (decValue .longValue ());
118
122
}
119
123
return DecimalUtils .extractSecondsAndNanos (decValue , Duration ::ofSeconds );
120
124
case JsonTokenId .ID_NUMBER_INT :
121
125
long intValue = parser .getLongValue ();
122
- if (_durationPattern != null ) {
123
- return _durationPattern .parse (intValue );
126
+ if (_durationUnitParser != null ) {
127
+ return _durationUnitParser .parse (intValue );
124
128
}
125
129
return _fromTimestamp (context , intValue );
126
130
case JsonTokenId .ID_STRING :
@@ -160,8 +164,8 @@ && _isValidTimestampString(value)) {
160
164
}
161
165
162
166
try {
163
- if (_durationPattern != null ) {
164
- return _durationPattern .parse (NumberInput .parseLong (value ));
167
+ if (_durationUnitParser != null ) {
168
+ return _durationUnitParser .parse (NumberInput .parseLong (value ));
165
169
}
166
170
167
171
return Duration .parse (value );
@@ -177,21 +181,21 @@ protected Duration _fromTimestamp(DeserializationContext ctxt, long ts) {
177
181
return Duration .ofMillis (ts );
178
182
}
179
183
180
- protected static class DurationPattern {
184
+ protected static class DurationUnitParser {
181
185
final TemporalUnit unit ;
182
186
183
- DurationPattern (TemporalUnit unit ) {
187
+ DurationUnitParser (TemporalUnit unit ) {
184
188
this .unit = unit ;
185
189
}
186
190
187
191
Duration parse (long value ) {
188
192
return Duration .of (value , unit );
189
193
}
190
194
191
- static Optional <DurationPattern > from (String pattern ) {
195
+ static Optional <DurationUnitParser > from (String unit ) {
192
196
return Stream .of (ChronoUnit .values ())
193
- .filter (u -> u .toString ().equalsIgnoreCase (pattern ))
194
- .map (DurationPattern ::new )
197
+ .filter (u -> u .toString ().equalsIgnoreCase (unit ))
198
+ .map (DurationUnitParser ::new )
195
199
.findFirst ();
196
200
}
197
201
}
0 commit comments