Skip to content

Commit 77529f8

Browse files
committed
Merge branch '2.x' into 3.x
2 parents cb7ef9e + 92ec550 commit 77529f8

File tree

4 files changed

+173
-5
lines changed

4 files changed

+173
-5
lines changed

src/main/java/tools/jackson/databind/deser/jdk/EnumMapDeserializer.java

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -285,10 +285,18 @@ public EnumMap<?,?> deserialize(JsonParser p, DeserializationContext ctxt,
285285
if (_skipNullValues) {
286286
continue;
287287
}
288-
value = _nullProvider.getNullValue(ctxt);
288+
value = null;
289289
} else {
290290
value = _deserializeNoNullChecks(p, ctxt);
291291
}
292+
293+
if (value == null) {
294+
value = _nullProvider.getNullValue(ctxt);
295+
296+
if (value == null && _skipNullValues) {
297+
continue;
298+
}
299+
}
292300
} catch (Exception e) {
293301
return wrapAndThrow(ctxt, e, result, keyStr);
294302
}
@@ -374,10 +382,18 @@ public EnumMap<?,?> _deserializeUsingProperties(JsonParser p, DeserializationCon
374382
if (_skipNullValues) {
375383
continue;
376384
}
377-
value = _nullProvider.getNullValue(ctxt);
385+
value = null;
378386
} else {
379387
value = _deserializeNoNullChecks(p, ctxt);
380388
}
389+
390+
if (value == null) {
391+
value = _nullProvider.getNullValue(ctxt);
392+
393+
if (value == null && _skipNullValues) {
394+
continue;
395+
}
396+
}
381397
} catch (Exception e) {
382398
wrapAndThrow(ctxt, e, _containerType.getRawClass(), keyName);
383399
return null;

src/main/java/tools/jackson/databind/deser/jdk/MapDeserializer.java

Lines changed: 47 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -525,10 +525,19 @@ protected final Map<Object,Object> _readAndBind(JsonParser p, DeserializationCon
525525
if (_skipNullValues) {
526526
continue;
527527
}
528-
value = _nullProvider.getNullValue(ctxt);
528+
value = null;
529529
} else {
530530
value = _deserializeNoNullChecks(p, ctxt);
531531
}
532+
533+
if (value == null) {
534+
value = _nullProvider.getNullValue(ctxt);
535+
536+
if (value == null && _skipNullValues) {
537+
continue;
538+
}
539+
}
540+
532541
if (useObjectId) {
533542
referringAccumulator.put(key, value);
534543
} else {
@@ -587,10 +596,19 @@ protected final Map<Object,Object> _readAndBindStringKeyMap(JsonParser p, Deseri
587596
if (_skipNullValues) {
588597
continue;
589598
}
590-
value = _nullProvider.getNullValue(ctxt);
599+
value = null;
591600
} else {
592601
value = _deserializeNoNullChecks(p, ctxt);
593602
}
603+
604+
if (value == null) {
605+
value = _nullProvider.getNullValue(ctxt);
606+
607+
if (value == null && _skipNullValues) {
608+
continue;
609+
}
610+
}
611+
594612
if (useObjectId) {
595613
referringAccumulator.put(key, value);
596614
} else {
@@ -658,10 +676,18 @@ public Map<Object,Object> _deserializeUsingCreator(JsonParser p, Deserialization
658676
if (_skipNullValues) {
659677
continue;
660678
}
661-
value = _nullProvider.getNullValue(ctxt);
679+
value = null;
662680
} else {
663681
value = _deserializeNoNullChecks(p, ctxt);
664682
}
683+
684+
if (value == null) {
685+
value = _nullProvider.getNullValue(ctxt);
686+
687+
if (value == null && _skipNullValues) {
688+
continue;
689+
}
690+
}
665691
} catch (Exception e) {
666692
wrapAndThrow(ctxt, e, _containerType.getRawClass(), key);
667693
return null;
@@ -735,6 +761,15 @@ protected final void _readAndUpdate(JsonParser p, DeserializationContext ctxt,
735761
} else {
736762
value = _deserializeNoNullChecks(p, ctxt);
737763
}
764+
765+
if (value == null) {
766+
value = _nullProvider.getNullValue(ctxt);
767+
768+
if (value == null && _skipNullValues) {
769+
continue;
770+
}
771+
}
772+
738773
if (value != old) {
739774
result.put(key, value);
740775
}
@@ -798,6 +833,15 @@ protected final void _readAndUpdateStringKeyMap(JsonParser p, DeserializationCon
798833
} else {
799834
value = _deserializeNoNullChecks(p, ctxt);
800835
}
836+
837+
if (value == null) {
838+
value = _nullProvider.getNullValue(ctxt);
839+
840+
if (value == null && _skipNullValues) {
841+
continue;
842+
}
843+
}
844+
801845
if (value != old) {
802846
result.put(key, value);
803847
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package tools.jackson.databind.deser.jdk;
2+
3+
import java.util.EnumMap;
4+
5+
import org.junit.jupiter.api.Test;
6+
7+
import com.fasterxml.jackson.annotation.JsonSetter;
8+
import com.fasterxml.jackson.annotation.Nulls;
9+
import tools.jackson.core.type.TypeReference;
10+
import tools.jackson.databind.ObjectMapper;
11+
import tools.jackson.databind.exc.InvalidNullException;
12+
import tools.jackson.databind.json.JsonMapper;
13+
14+
import static org.junit.jupiter.api.Assertions.assertFalse;
15+
import static org.junit.jupiter.api.Assertions.assertTrue;
16+
import static org.junit.jupiter.api.Assertions.assertThrows;
17+
18+
// For [databind#5165]
19+
public class EnumMapDeserializer5165Test
20+
{
21+
public enum MyEnum {
22+
FOO
23+
}
24+
25+
static class Dst {
26+
private EnumMap<MyEnum, Integer> map;
27+
28+
public EnumMap<MyEnum, Integer> getMap() {
29+
return map;
30+
}
31+
32+
public void setMap(EnumMap<MyEnum, Integer> map) {
33+
this.map = map;
34+
}
35+
}
36+
37+
@Test
38+
public void nullsFailTest() {
39+
ObjectMapper mapper = JsonMapper.builder()
40+
.changeDefaultNullHandling(n -> JsonSetter.Value.forContentNulls(Nulls.FAIL))
41+
.build();
42+
assertThrows(
43+
InvalidNullException.class,
44+
() -> mapper.readValue("{\"map\":{\"FOO\":\"\"}}", new TypeReference<Dst>(){})
45+
);
46+
}
47+
48+
@Test
49+
public void nullsSkipTest() throws Exception {
50+
ObjectMapper mapper = JsonMapper.builder()
51+
.changeDefaultNullHandling(n -> JsonSetter.Value.forContentNulls(Nulls.SKIP))
52+
.build();
53+
Dst dst = mapper.readValue("{\"map\":{\"FOO\":\"\"}}", new TypeReference<Dst>() {});
54+
55+
assertTrue(dst.getMap().isEmpty());
56+
}
57+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package tools.jackson.databind.deser.jdk;
2+
3+
import java.util.Map;
4+
5+
import org.junit.jupiter.api.Test;
6+
7+
import com.fasterxml.jackson.annotation.JsonSetter;
8+
import com.fasterxml.jackson.annotation.Nulls;
9+
import tools.jackson.core.type.TypeReference;
10+
import tools.jackson.databind.ObjectMapper;
11+
import tools.jackson.databind.exc.InvalidNullException;
12+
import tools.jackson.databind.json.JsonMapper;
13+
14+
import static org.junit.jupiter.api.Assertions.assertTrue;
15+
import static org.junit.jupiter.api.Assertions.assertThrows;
16+
17+
// For [databind#5165]
18+
public class MapDeserializer5165Test
19+
{
20+
static class Dst {
21+
private Map<String, Integer> map;
22+
23+
public Map<String, Integer> getMap() {
24+
return map;
25+
}
26+
27+
public void setMap(Map<String, Integer> map) {
28+
this.map = map;
29+
}
30+
}
31+
32+
@Test
33+
public void nullsFailTest() {
34+
ObjectMapper mapper = JsonMapper.builder()
35+
.changeDefaultNullHandling(n -> JsonSetter.Value.forContentNulls(Nulls.FAIL))
36+
.build();
37+
assertThrows(
38+
InvalidNullException.class,
39+
() -> mapper.readValue("{\"map\":{\"key\":\"\"}}", new TypeReference<Dst>(){})
40+
);
41+
}
42+
43+
@Test
44+
public void nullsSkipTest() throws Exception {
45+
ObjectMapper mapper = JsonMapper.builder()
46+
.changeDefaultNullHandling(n -> JsonSetter.Value.forContentNulls(Nulls.SKIP))
47+
.build();
48+
Dst dst = mapper.readValue("{\"map\":{\"key\":\"\"}}", new TypeReference<Dst>() {});
49+
assertTrue(dst.getMap().isEmpty());
50+
}
51+
}

0 commit comments

Comments
 (0)