Skip to content

Commit d311e7b

Browse files
authored
Polymorphic Deduction Tests for Object vs Array (#4791)
Tests for #4772, mark as fixed (actually fix via FasterXML/jackson-core#1356 for 2.19.0)
1 parent b63d636 commit d311e7b

File tree

7 files changed

+115
-8
lines changed

7 files changed

+115
-8
lines changed

release-notes/CREDITS-2.x

+3
Original file line numberDiff line numberDiff line change
@@ -1828,6 +1828,9 @@ Eduard Gomoliako (@Gems)
18281828
* Reported #4602: Possible wrong use of _arrayDelegateDeserializer in
18291829
BeanDeserializerBase::deserializeFromObjectUsingNonDefault()
18301830
(2.18.0)
1831+
* Reported #4772: Serialization and deserialization issue of sub-types used with
1832+
`JsonTypeInfo.Id.DEDUCTION` where sub-types are Object and Array
1833+
(2.19.0)
18311834
18321835
Mathijs Vogelzang (@mathijs81)
18331836
* Reported #4678: Java records don't serialize with `MapperFeature.REQUIRE_SETTERS_FOR_GETTERS`

release-notes/VERSION-2.x

+3
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ Project: jackson-databind
2424
Map object is ignored when Map key type not defined
2525
(reported by @devdanylo)
2626
(fix by Joo-Hyuk K)
27+
#4772: Serialization and deserialization issue of sub-types used with
28+
`JsonTypeInfo.Id.DEDUCTION` where sub-types are Object and Array
29+
(reported by Eduard G)
2730
#4773: `SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS` should not apply to Maps
2831
with uncomparable keys
2932
(requested by @nathanukey)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
package com.fasterxml.jackson.databind.jsontype;
2+
3+
import java.util.ArrayList;
4+
import java.util.Arrays;
5+
import java.util.Collection;
6+
import java.util.Iterator;
7+
8+
import org.junit.jupiter.api.Test;
9+
10+
import com.fasterxml.jackson.annotation.*;
11+
import com.fasterxml.jackson.databind.ObjectMapper;
12+
import com.fasterxml.jackson.databind.testutil.DatabindTestUtil;
13+
14+
import static org.junit.jupiter.api.Assertions.*;
15+
16+
public class PolymorphicDeductionObjectVsArrayTest extends DatabindTestUtil {
17+
@JsonTypeInfo(use = JsonTypeInfo.Id.DEDUCTION, defaultImpl = DataArray.class)
18+
@JsonSubTypes({@JsonSubTypes.Type(DataObject.class), @JsonSubTypes.Type(DataArray.class)})
19+
interface Data {
20+
@JsonIgnore
21+
boolean isObject();
22+
}
23+
24+
static class DataItem {
25+
final String id;
26+
27+
@JsonCreator(mode = JsonCreator.Mode.PROPERTIES)
28+
DataItem(@JsonProperty("id") String id) {
29+
this.id = id;
30+
}
31+
32+
public String getId() {
33+
return id;
34+
}
35+
}
36+
37+
static class DataObject extends DataItem implements Data {
38+
39+
@JsonCreator(mode = JsonCreator.Mode.PROPERTIES)
40+
DataObject(@JsonProperty("id") String id) {
41+
super(id);
42+
}
43+
44+
@Override
45+
public boolean isObject() {
46+
return true;
47+
}
48+
}
49+
50+
static class DataArray extends ArrayList<DataItem> implements Data {
51+
private static final long serialVersionUID = 1L;
52+
53+
@JsonCreator
54+
DataArray(Collection<DataItem> items) {
55+
super(new ArrayList<>(items));
56+
}
57+
58+
@Override
59+
public boolean isObject() {
60+
return false;
61+
}
62+
}
63+
64+
static class Container {
65+
@JsonProperty("data")
66+
Data data;
67+
}
68+
69+
private final ObjectMapper MAPPER = newJsonMapper();
70+
71+
private static final String containerWithObjectData = a2q("{'data':{'id':'#1'}}");
72+
73+
private static final String containerWithArrayData = a2q("{'data':[{'id':'#1'}]}");
74+
75+
@Test
76+
public void testDeserialization() throws Exception {
77+
Container container = MAPPER.readValue(containerWithObjectData, Container.class);
78+
79+
assertInstanceOf(DataObject.class, container.data);
80+
assertSame(container.data.getClass(), DataObject.class);
81+
assertTrue(container.data.isObject());
82+
assertEquals("#1", ((DataItem) container.data).id);
83+
84+
container = MAPPER.readValue(containerWithArrayData, Container.class);
85+
assertInstanceOf(DataArray.class, container.data);
86+
assertEquals(container.data.getClass(), DataArray.class);
87+
assertFalse(container.data.isObject());
88+
89+
@SuppressWarnings("unchecked")
90+
Iterator<DataItem> arrayDataIterator = ((Iterable<DataItem>) container.data).iterator();
91+
92+
assertTrue(arrayDataIterator.hasNext());
93+
assertEquals("#1", arrayDataIterator.next().id);
94+
}
95+
96+
@Test
97+
public void testSerialization() throws Exception {
98+
Container container = new Container();
99+
container.data = new DataObject("#1");
100+
String json = MAPPER.writeValueAsString(container);
101+
assertEquals(containerWithObjectData, json);
102+
103+
container = new Container();
104+
container.data = new DataArray(Arrays.asList(new DataItem("#1")));
105+
json = MAPPER.writeValueAsString(container);
106+
assertEquals(containerWithArrayData, json);
107+
}
108+
}

src/test/java/com/fasterxml/jackson/databind/jsontype/TestGenericListSerialization.java

-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import com.fasterxml.jackson.core.type.TypeReference;
1111
import com.fasterxml.jackson.databind.*;
1212
import com.fasterxml.jackson.databind.testutil.DatabindTestUtil;
13-
import com.fasterxml.jackson.databind.type.TypeFactory;
1413

1514
import static org.junit.jupiter.api.Assertions.*;
1615

src/test/java/com/fasterxml/jackson/databind/jsontype/TestPolymorphicDeduction.java

+1-5
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,11 @@
99
import com.fasterxml.jackson.annotation.JsonTypeInfo;
1010
import com.fasterxml.jackson.annotation.JsonValue;
1111

12-
import com.fasterxml.jackson.databind.DeserializationFeature;
13-
import com.fasterxml.jackson.databind.JavaType;
14-
import com.fasterxml.jackson.databind.MapperFeature;
15-
import com.fasterxml.jackson.databind.ObjectMapper;
12+
import com.fasterxml.jackson.databind.*;
1613
import com.fasterxml.jackson.databind.exc.InvalidDefinitionException;
1714
import com.fasterxml.jackson.databind.exc.InvalidTypeIdException;
1815
import com.fasterxml.jackson.databind.json.JsonMapper;
1916
import com.fasterxml.jackson.databind.testutil.DatabindTestUtil;
20-
import com.fasterxml.jackson.databind.type.TypeFactory;
2117

2218
import static org.junit.jupiter.api.Assertions.*;
2319

src/test/java/com/fasterxml/jackson/databind/jsontype/TestTypeNames.java

-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
import com.fasterxml.jackson.databind.*;
1313
import com.fasterxml.jackson.databind.jsontype.impl.StdSubtypeResolver;
1414
import com.fasterxml.jackson.databind.testutil.DatabindTestUtil;
15-
import com.fasterxml.jackson.databind.type.TypeFactory;
1615

1716
import static org.junit.jupiter.api.Assertions.*;
1817

src/test/java/com/fasterxml/jackson/databind/jsontype/TestTypedDeserialization.java

-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
import com.fasterxml.jackson.databind.*;
1515
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
1616
import com.fasterxml.jackson.databind.testutil.DatabindTestUtil;
17-
import com.fasterxml.jackson.databind.type.TypeFactory;
1817

1918
import static org.junit.jupiter.api.Assertions.*;
2019

0 commit comments

Comments
 (0)