Skip to content

Commit 5e0d5f6

Browse files
authored
Create CustomObjectKeyDeserializer4680Test.java (#4685)
1 parent 450071b commit 5e0d5f6

File tree

1 file changed

+70
-0
lines changed

1 file changed

+70
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package com.fasterxml.jackson.failing;
2+
3+
import java.util.Map;
4+
5+
import com.fasterxml.jackson.core.type.TypeReference;
6+
import com.fasterxml.jackson.databind.DeserializationContext;
7+
import com.fasterxml.jackson.databind.KeyDeserializer;
8+
import com.fasterxml.jackson.databind.ObjectMapper;
9+
import com.fasterxml.jackson.databind.json.JsonMapper;
10+
import com.fasterxml.jackson.databind.module.SimpleModule;
11+
12+
import org.junit.jupiter.api.Assertions;
13+
import org.junit.jupiter.api.Test;
14+
15+
// [databind#4680] Custom key deserialiser registered for `Object.class` is ignored on nested JSON
16+
public class CustomObjectKeyDeserializer4680Test
17+
{
18+
19+
@Test
20+
void testCustomKeyDeserializer()
21+
throws Exception
22+
{
23+
// GIVEN
24+
String json =
25+
"{\n" +
26+
" \"name*\": \"Erik\",\n" +
27+
" \"address*\": {\n" +
28+
" \"city*\": {\n" +
29+
" \"id*\": 1,\n" +
30+
" \"name*\": \"Berlin\"\n" +
31+
" },\n" +
32+
" \"street*\": \"Elvirastr\"\n" +
33+
" }\n" +
34+
" }";
35+
36+
SimpleModule keySanitizationModule = new SimpleModule("key-sanitization");
37+
keySanitizationModule.addKeyDeserializer(String.class, new KeyDeserializer() {
38+
@Override
39+
public String deserializeKey(String key, DeserializationContext ctxt) {
40+
return key.replace("*", "_");
41+
}
42+
});
43+
44+
keySanitizationModule.addKeyDeserializer(Object.class, new KeyDeserializer() {
45+
@Override
46+
public Object deserializeKey(String key, DeserializationContext ctxt) {
47+
return key.replace("*", "_");
48+
}
49+
});
50+
51+
ObjectMapper mapper = JsonMapper.builder().addModule(keySanitizationModule).build();
52+
53+
// WHEN
54+
Map<String, Object> result = mapper.readValue(json, new TypeReference<Map<String, Object>>() {
55+
});
56+
57+
// THEN
58+
// depth 1 works as expected
59+
Assertions.assertEquals("Erik", result.get("name_"));
60+
61+
// before fix, depth 2 does NOT work as expected
62+
Map<String, Object> addressMap = (Map<String, Object>) result.get("address_");
63+
// before fix, null?? Fails here
64+
Assertions.assertEquals("Elvirastr", addressMap.get("street_"));
65+
Map<String, Object> cityMap = (Map<String, Object>) addressMap.get("city_");
66+
Assertions.assertEquals(1, cityMap.get("id_"));
67+
Assertions.assertEquals("Berlin", cityMap.get("name_"));
68+
}
69+
70+
}

0 commit comments

Comments
 (0)