24
24
import java .time .temporal .Temporal ;
25
25
import java .util .Calendar ;
26
26
import java .util .Date ;
27
+ import java .util .Map ;
27
28
import java .util .TimeZone ;
28
29
30
+ import com .fasterxml .jackson .annotation .JsonFormat ;
29
31
import com .fasterxml .jackson .core .JsonParser ;
30
32
import com .fasterxml .jackson .core .JsonToken ;
31
33
34
+ import com .fasterxml .jackson .core .type .TypeReference ;
32
35
import com .fasterxml .jackson .databind .*;
33
36
import com .fasterxml .jackson .databind .deser .DeserializationProblemHandler ;
34
37
import com .fasterxml .jackson .databind .exc .InvalidFormatException ;
@@ -46,6 +49,7 @@ public class LocalDateTimeDeserTest
46
49
{
47
50
private final static ObjectMapper MAPPER = newMapper ();
48
51
private final static ObjectReader READER = MAPPER .readerFor (LocalDateTime .class );
52
+ private final TypeReference <Map <String , LocalDateTime >> MAP_TYPE_REF = new TypeReference <Map <String , LocalDateTime >>() { };
49
53
50
54
/*
51
55
/**********************************************************
@@ -174,6 +178,58 @@ public void testBadDeserializationAsString01() throws Throwable
174
178
}
175
179
}
176
180
181
+ /*
182
+ /**********************************************************
183
+ /* Tests for empty string handling
184
+ */
185
+ /**********************************************************
186
+ */
187
+
188
+ @ Test
189
+ public void testLenientDeserializeFromEmptyString () throws Exception {
190
+
191
+ String key = "datetime" ;
192
+ ObjectMapper mapper = newMapper ();
193
+ ObjectReader objectReader = mapper .readerFor (MAP_TYPE_REF );
194
+
195
+ String dateValAsNullStr = null ;
196
+ String dateValAsEmptyStr = "" ;
197
+
198
+ String valueFromNullStr = mapper .writeValueAsString (asMap (key , dateValAsNullStr ));
199
+ Map <String , LocalDateTime > actualMapFromNullStr = objectReader .readValue (valueFromNullStr );
200
+ LocalDateTime actualDateFromNullStr = actualMapFromNullStr .get (key );
201
+ assertNull (actualDateFromNullStr );
202
+
203
+ String valueFromEmptyStr = mapper .writeValueAsString (asMap (key , dateValAsEmptyStr ));
204
+ Map <String , LocalDateTime > actualMapFromEmptyStr = objectReader .readValue (valueFromEmptyStr );
205
+ LocalDateTime actualDateFromEmptyStr = actualMapFromEmptyStr .get (key );
206
+ assertEquals ("empty string failed to deserialize to null with lenient setting" ,actualDateFromNullStr , actualDateFromEmptyStr );
207
+ }
208
+
209
+ @ Test ( expected = MismatchedInputException .class )
210
+ public void testStrictDeserializFromEmptyString () throws Exception {
211
+
212
+ final String key = "datetime" ;
213
+ final ObjectMapper mapper = mapperBuilder ()
214
+ .withConfigOverride (LocalDateTime .class ,
215
+ c -> c .setFormat (JsonFormat .Value .forLeniency (false ))
216
+ )
217
+ .build ();
218
+ final ObjectReader objectReader = mapper .readerFor (MAP_TYPE_REF );
219
+ final String dateValAsNullStr = null ;
220
+
221
+ // even with strict, null value should be deserialized without throwing an exception
222
+ String valueFromNullStr = mapper .writeValueAsString (asMap (key , dateValAsNullStr ));
223
+ Map <String , LocalDateTime > actualMapFromNullStr = objectReader .readValue (valueFromNullStr );
224
+ assertNull (actualMapFromNullStr .get (key ));
225
+
226
+ String dateValAsEmptyStr = "" ;
227
+ // TODO: nothing stops us from writing an empty string, maybe there should be a check there too?
228
+ String valueFromEmptyStr = mapper .writeValueAsString (asMap ("date" , dateValAsEmptyStr ));
229
+ // with strict, deserializing an empty string is not permitted
230
+ objectReader .readValue (valueFromEmptyStr );
231
+ }
232
+
177
233
/*
178
234
/**********************************************************
179
235
/* Tests for alternate array handling
0 commit comments